汇编 - 验证ISBN(某处的逻辑错误)

rcj*_*rcj 0 x86 assembly

我正在做一个大学课程的项目.

首先,我不是要求完整的解决方案.我很难找到错误的地方.当我输入有效的ISBN,3201541974时,我的程序会打印"无效"的代码块.我很欣赏你可以看到的任何逻辑错误的提示,而且我也想知道是否有更好的调试方法,而不是一次盯着我的所有代码.我习惯于依赖简单的打印语句和断点.

编辑:问题出在这里

L1_top:
        mov     al, [esi]               ; get a character
        inc     esi         ; update source pointer
        sub     al, 0
        add     ah, al
        cmp     ah, 11
    .......
Run Code Online (Sandbox Code Playgroud)

我从al中减去0的原因是因为al最初是一个char.从al中减去'0'将其转换为int或w/e.我错误地减去0而不是'0'

正确的是

        sub     al, '0'
Run Code Online (Sandbox Code Playgroud)

Dus*_*n F 6

首先,我想说我实际上是你的TA课程,很好,你只是寻求帮助调试,而不是寻求答案,但我们确实有办公时间,我们非常友好.

我将首先回答更简单的问题.有一种更简单的方法可以在代码中找到问题,它被称为gdb.它基本上只是一个调试器.以这种方式调试非常有用,因为它允许您在运行程序时查看寄存器和内存中的实际内容.以下是有关如何使用它的一些信息的链接.我建议你阅读它,因为它真的很有帮助.gdb帮助.

现在进入更复杂的部分.

  • 我不明白为什么你有msg10或msg11,当你理解逻辑设置的方式时,你也可以摆脱它们和msg5.
  • 在您的错误检查中,您可能希望将eax与11进行比较,如果相等则跳转.这样,只要有正确的位数,它就只需要处理逻辑.(10位+新线)
  • 在你的循环中,你应该检查值是否在'0'和'9'之间(是撇号很重要,它们告诉计算机值是ASCII而不是数字)或'X'.
  • 在你有了那个之后,你应该检查"sum"和"t"是否大于或等于11,如果它们是11减去11,并且整个循环得到10次,每个角色一次.