我正在编写一个相当简单的程序来获取用户输入整数作为字符串,验证它们并将它们添加到整数数组中。出于某种原因,当我点击lodsb
命令时,我一直收到未处理的异常错误。
这是相关的代码位。我有一种感觉,我错过了清除或坚持lodsb
使用的东西,但我无法将手指放在上面。我试过跟随其他代码位做类似的事情(不是下面的内容),但它们似乎也不适合我。任何帮助找出我出错的地方将不胜感激。提前谢谢。
MAXSIZE = 10
getString MACRO varName
push ecx
push edx
mov edx, OFFSET varName
mov ecx, (SIZEOF varName) -1 ;; leave room for 0 byte
call ReadString
pop edx
pop ecx
ENDM
.data
newInt BYTE MAXSIZE DUP(0)
.code
NOTINT:
getString newInt
mov ecx, eax
VALIDATE:
VALLOOP:
push esi
mov eax, 0
lodsb
cmp eax, 48 ; '0' is character 48
displayString notValid
jb NOTINT
cmp eax, 57 ; '9' is character 57
displayString notValid
ja NOTINT
pop esi
loop VALLOOP
答案 0 :(得分:2)
我在您的代码中发现了几个错误。
lodsb
无法正常运行。push
和pop
ESI围绕lodsb
指令,因此它将始终处理相同的字节。 displayString notValid
中的(宏)代码会保留标志的状态,因为以下cmp
指令依赖于它吗? 这可行:
.code
NOTINT:
getString newInt
mov ecx, eax
mov esi, offset newInt
cld ;One too many of these won't harm!
VALLOOP:
lodsb
cmp al, '0'
jb NOTINT
cmp al, '9'
ja NOTINT
loop VALLOOP