如果功能相同,NASM组件会跳转

时间:2015-12-12 08:35:10

标签: assembly x86 nasm

我对汇编编程非常陌生,只是编写简单的小程序并编写大量的教程来尝试自学。我一天中大部分时间都在使用bash和python,但汇编在我的工作领域有很大的优势,而且我很着迷于它。

我正在编写一个小程序,以便用户输入' y'或者' n'比较它并输出2条消息之一。它很直接,但我无法弄清楚我的跳跃逻辑在哪里失败,并且想知道是否有人能指出我正确的方向。

我在Windows 7 x64中使用NASM,这段代码编译没有问题,我已经将问题追溯到我的跳转指令。以下是我的代码。我的问题是,在输入y或n之后,它似乎没有正确地调用yes_msg或no_msg,并且在谷歌的一个下午之后,在这里我一直无法弄明白。如果有人可以提供帮助,我将非常感激。

感谢。

$scope.globalData.requireLogin

2 个答案:

答案 0 :(得分:1)

首先,scanf返回已处理条目的数量(它将驻留在eax中)。检查一下,0表示scanf被拒绝解析(并且你无法检查缓冲区,因为它可以保留一些垃圾 - 根据NASM文档,resb提供未初始化的存储,可以填充,例如,运行时加载器临时值)。仅当scanf返回1时,您才应该依赖缓冲区内容。

其次,您的比较处理eax和edx中的4字节值。同样,即使mov edx,'y'用0x00000075填充它,也不能确定eax只包含最低有效字节。请改为呼叫cmp al, dl

(顺便说一句,你的_yes_msg,_no_msg小姐回到主要,它会打印"你说是的!"然后"你说不!" on' y'。是故意的吗?)

答案 1 :(得分:1)

您的指令mov eax, inpt移动EAX寄存器中 inpt 的缓冲区的地址。您需要此位置的第一个字节,因此您必须编写mov al, [inpt]。记住这是NASM!

现在您可以比较内容:

mov dl, 'y'
cmp al, dl

您将对_scanf调用的清理放置在绝对跳转之下,因此永远不会执行。将其移动到呼叫本身的正下方:

call _scanf
add esp, 8
mov al, [inpt]

正如@Netch所说,您应该更改 _yes_msg _no_msg 的代码,因为现在您连续收到这两封邮件而且不会退出该程序喜欢它。