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

时间:2013-02-18 02:07:36

标签: assembly x86

我正在为college course开展一个项目。

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

编辑:问题在这里

L1_top:
        mov     al, [esi]               ; get a character
        inc     esi         ; update source pointer
        sub     al, 0
        add     ah, al
        cmp     ah, 11
    .......

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

正确的行是

        sub     al, '0'

2 个答案:

答案 0 :(得分:6)

首先,我想说我实际上是你这门课程的助教,你只是寻求帮助调试而不是寻求答案,这很好,但我们确实有办公时间,我们很漂亮友好。

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

现在进入更复杂的部分。

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

答案 1 :(得分:2)

不幸的是,“打印语句”并不容易编写 - 只需调用“print_debug_out”函数就会改变大部分相关状态(标志,堆栈等)。但是可以编写它们并且只执行一次。创建一个包含调试函数和宏的迷你库!

我也建议gdb。使用调试信息(-g)进行汇编并使用gdb进行调试。您可能需要找到教程或GUI包装器,但是学习使用gdb(或其他调试器)非常值得您学习。

请注意,您可以在源代码和调试器中设置断点。只需使用int 3int3说明。