我又一次在做 MASM 编程。我正在尝试使用 Irvine32 库编写一个程序,其中用户输入一个字符串,该字符串被放入带有 ReadString 的 BYTE 数组中。然后它遍历该数组并确定每个字符是否为数字。但是,当我尝试
cmp [buffer + ecx], 30h
MASM 抱怨比较两个大小不同的东西。无论如何我可以将数组中每个 BYTE 中的 ASCII 码作为 DWORD 读取(或者以其他方式提取每个 BYTE 中的 ASCII 值)?
这行得通吗?
cmp BYTE PTR [buffer + ecx], 30h
要将 BYTE 提取为 DWORD,您可以执行以下操作:
mov EAX, 0
mov AL, [pointer]
甚至更好(感谢马丁):
movzx EAX, [pointer]
getData PROC
push ebp
mov ebp, esp
mov esi, [ebp + 12] ; offset of buffer
mov ebx, [ebp + 8] ; where to write answer
GETNUMBERSTRING:
mov edx, esi
mov ecx, BufferSize
mov eax, 0
call ReadString
mov ecx, eax ; set size to loop counter
cld
mov edx, 0
PROCESSSTRING:
lodsb
cmp al, 30h
jl WRONG
cmp al, 39h
jg WRONG
; add digit into total edx
sub al, 30h
push eax ; multiply edx by 10
push ecx
mov eax, edx
mov ecx, 10
mul ecx
mov edx, eax
pop ecx
pop eax
push ebx ; add to the total
movsx ebx, al
add edx, ebx
pop ebx
loop PROCESSSTRING
jmp DONE
WRONG:
call Crlf
stringWriterEndl invalid
jmp GETNUMBERSTRING
DONE:
mov [ebx], edx
pop ebp
ret 8
getData ENDP
这就是我需要做的。