首先,忘记所谓的字符串指令(scas,comps,movs)。其次,你需要一个带有索引的固定指针(dispkacement),例如[esi+ebx]
。你认为WriteString
需要一个以空字符结尾的字符串吗?
INCLUDE Irvine32.inc
.DATA
selectedWords BYTE "BICYCLE"
guessWords BYTE SIZEOF selectedWords DUP ('-'), 0 ; With null-termination for WriteString
inputLetter BYTE 'C'
.CODE
main PROC
mov esi, offset selectedWords ; Source
mov edi, offset guessWords ; Destination
mov ecx, LENGTHOF selectedWords ; Number of bytes to check
mov al, inputLetter ; Search for that character
xor ebx, ebx ; Index EBX = 0
ride_hard_loop:
cmp [esi+ebx], al ; Compare memory/register
jne @F ; Skip next line if no match
mov [edi+ebx], al ; Hang 'em lower
@@:
inc ebx ; Increment pointer
dec ecx ; Decrement counter
jne ride_hard_loop ; Jump if ECX != 0
mov edx, edi
call WriteString ; Irvine32: Write a null-terminated string pointed to by EDX
exit ; Irvine32: ExitProcess
main ENDP
END main
顺便说一句,与hang子手你也可以使用不同的方法,有布尔阵列的字母大小,要记住,哪个字符已经被猜到了。然后,在输出当前已知的单词部分时,可以逐字逐句浏览“选定单词”,并根据字母布尔数组的状态输出“ - ”或字母本身。所以你根本不需要“猜词”。在格式化输出之后,您可以保留多少字母显示为'''',这样您就可以使用它来确定是否有更多字母需要猜测,或者单词是否完整。 – Ped7g