利用栈逆序存放数据 32位x86汇编

来自烟台大学贺利坚老师的题,修改后以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正好逆序。
在这里插入图片描述
最后点击选项栏里的绿三角继续执行退出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值