使用MASM逐步执行堆栈

时间:2012-11-16 03:01:02

标签: masm

我正在尝试编写一个简单的程序集应用程序,它从用户读取字符,然后检查输入的字符串是否可以被视为整数。

mov       ebx,esp
input:
get_ch    eax
cmp       eax,0dh
je        continue
push      eax
jmp       input

continue:
put_str    0ah

xor       edx,edx
output:

这是我失去的地方......

put_ch    dword ptr [ebx-4][edx]
dec       edx
jmp       output

... [ebx-4]和edx = 0,我可以输出第一个字符。之后,它似乎输出空格或空字符。

任何帮助或参考链接都将非常感激,我很难找到可以查找MASM的内容。

2 个答案:

答案 0 :(得分:1)

1)我不熟悉put_ch或get_ch,但我认为put_ch dword ptr [ebx-4] [edx]在EBX和EDX调用之间需要','。

2)每次迭代更改EDX,但是指针(EBX)始终为ebx-4。如果我错了,请纠正我,但是你不应该改变EBX吗?我不认为-4实际上在每次迭代运行中都会从EBX中减去。

3)我认为如果你从0中减去,就像在EBX中一样,在汇编中你只设置溢出标志(OF),或者至少设置SF(符号标志)。检查您正在使用的ASM实现的标志,并查看设置哪些标志的命令。

答案 1 :(得分:0)

在我看来,你不必从输出循环的有效地址中减去4。也许您认为括号用于乘法。不是这种情况; IA-32不支持这种类型的寻址。在你的代码中,你放了......

put_ch    dword ptr [ebx-4][edx]
dec       edx
jmp       output

在循环的第一次迭代的第一条指令中,因为* put_ch *宏的有效地址导致-4,相对于堆栈帧的顶部(EBX)。该数字表示堆栈上的地址,将传递给宏以成功打印ASCII代码。但是,由于 dec edx 指令,第二次迭代将失败,因为程序将调用* put_ch *,参数为-5。由于这个地址的dword几乎毫无疑问地包含0,* put_ch *会将其注册为NULL字符,表示字符串的结尾。 试试这个:

dec       edx
put_ch    dword ptr [ebx][edx*4]
jmp       output

这里,EDX首先递减 ,并在宏中用作要乘以4的索引。因此,传递给* put_ch *的第一个地址将是-4。传递的第二个地址是-8。第三个是-12,依此类推......

最后,我强烈建议,在将get_ch的返回值与0dh(回车)进行比较时,为了使用AL(1字节)而不是EAX(4字节),以防上层3个字节的EAX包含任意数据。

祝你好运。