来自烟台大学贺利坚老师的题,修改后以32位的exe在VS上调试。
贺利坚老师其他涉及硬件的代码我就不写对应的32位版本了,后续可能会发点汇编相关。学了汇编以后感觉有点没意思,主要是我不知道该往哪个业务上使用它,除了让自己在鄙视链里高一点,我并没有得到使用它的快乐。
32位代码如下所示,复制粘贴容易出错,如果有bug,重新手打一遍VS可能生成成功。
.model flat, stdcall
.data
num dw 1234h,5678h,9abch,0def0h,1357h,2468h,369ah,48cfh
res dw 8 dup(?) ;?占位
.code
main proc
lea edi, num ;num地址放入edi
mov ecx, 8
nextitem1:
push word ptr [edi] ;x86的堆栈由操作系统维护,大胆压栈。
;内存输入,必须使用word ptr规定输入长度
add edi, 2
loop nextitem1
lea edi, res
mov ecx, 8
nextitem2:
pop word ptr [edi]
add edi, 2
loop nextitem2
ret
main endp ;函数main结束
end main ;从main开始
调试断点建议下在lea edi, num、lea edi, res、ret三行,方便跳过loop过程。
首先启动调试,1次F11,执行lea edi, num,得到.data中num数据地址、栈顶地址。
edi寄存器中记录了num地址,内存数据如下
esp寄存器中记录了栈顶地址,由于push使esp减少,所以更上的位置才是数据会存入的地址。
F11继续执行,直到栈内数据发生变化。可以看到32位的数据已被入栈。
F5直接执行至下一断点,观察栈内变化,所有数据都已入栈。
1次F11,执行lea edi, res,得到.data中res数据地址。一般情况下res的地址会在num之后,但二者也可能并不靠近。
F11继续执行,栈中数据弹出至res预留的位置中。
F5执行至ret,观察res变化,与num正好逆序。
最后点击选项栏里的绿三角继续执行退出。