错误的lodsb

时间:2015-08-14 00:21:46

标签: assembly x86 masm32

我正在编写一个相当简单的程序来获取用户输入整数作为字符串,验证它们并将它们添加到整数数组中。出于某种原因,当我点击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

1 个答案:

答案 0 :(得分:2)

我在您的代码中发现了几个错误。

  • 您永远不会初始化ESI寄存器,因此lodsb无法正常运行。
  • 即使你设置了ESI,那么循环也是无限的,因为pushpop ESI围绕lodsb指令,因此它将始终处理相同的字节。
  • 您确定displayString notValid中的(宏)代码会保留标志的状态,因为以下cmp指令依赖于它吗?
  • NOTINT 的条件跳转都跳出了一个在堆栈上推送值的代码块。该值不会弹出,因此堆栈将被破坏。

这可行:

.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