我正在为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'
答案 0 :(得分:6)
首先,我想说我实际上是你这门课程的助教,你只是寻求帮助调试而不是寻求答案,这很好,但我们确实有办公时间,我们很漂亮友好。
我将首先回答更简单的问题。有一种更简单的方法可以在代码中找到问题,它被称为gdb。它基本上只是一个调试器。以这种方式调试非常有用,因为它允许您在运行程序时查看寄存器和内存中的实际内容。以下是有关如何使用它的一些信息的链接。我建议你阅读它,因为它真的很有帮助。 gdb help
现在进入更复杂的部分。
答案 1 :(得分:2)
不幸的是,“打印语句”并不容易编写 - 只需调用“print_debug_out”函数就会改变大部分相关状态(标志,堆栈等)。但是可以编写它们并且只执行一次。创建一个包含调试函数和宏的迷你库!
我也建议gdb
。使用调试信息(-g)进行汇编并使用gdb进行调试。您可能需要找到教程或GUI包装器,但是学习使用gdb(或其他调试器)非常值得您学习。
请注意,您可以在源代码和调试器中设置断点。只需使用int 3
或int3
说明。