[汇编]汇编学习笔记(1):push,pop,call,jmp,retn

        不知道为啥,学啥后面都会碰到汇编指令┑( ̄Д  ̄)┍,看书学习DirectX引擎开发(才第4章)也要碰到,怒了,开始刚汇编,记录一些学习上的问题,好回头看看。
ESP:栈指针寄存器(extended stack pointer),永远指向系统栈最上面一个栈帧的栈顶
EIP:指令寄存器,存放当前指令的下一条指令的地址(就是CPU从这边开始执行)

push指令:把值压入栈中,ESP栈指针寄存器指向该值的地址,32位相当于ESP-4的地址,
pop指令:把值弹出栈,ESP栈指针寄存器指向该值得地址前一个地址(不好描述)相当于ESP+4的地址,
总结:
        push指令相当于先执行sub esp指令,再执行mov [esp],pop address指令相当于先执行先执行mov address, [esp],再执行add esp指令。刚好也明白为啥局部变量最好赋初值的问题,因为CPU在执行完push和pop指令后,ESP栈顶指针的下一个地址有可能就已经赋值了。

练习:

        第一个选中的框是用push和pop指令,第二个选中的框则是利用sub,add和mov指令实现push和pop指令,为了区分方便,中间都用上了mov eax, 0x0,将eax寄存器上的值全部赋为0,还有就是利用jmp指令把2段代码分开。

        单步到0x0166E4C8处,已经执行完2条指令,第一条将eax寄存器的值赋为11111111,第二条push指令,将esp的值减去4,并在栈顶0x0040F9A4地址处赋值为11111111(之前的值为00000000)。

        为了方便观察,0x0166E4CD处的指令将eax寄存器赋值为00000000。

        接着pop指令,将eax寄存器的值赋为栈顶指针所存的值,也就是0x0040F9A4的值,在把esp加4。在执行push之前和pop指令之后,eax和esp所存的值没有变化,除了栈顶指针下一个地址处(也就是0x0040F9A4)的值从00000000变成11111111。也就是为啥局部变量需要初始化的原因,因为该地址不清楚有没有被使用过。

       jmp指令已经跳转到0x0166E4D7出开始执行, 为了区分方便,这次就用上了99999999这个值,然后执行sub指令,将栈顶指针指向了下一个地址,也就是0x0040F9A4处,这个地址应该很眼熟了,就是上一个push和pop处常出现的地址。

       接着就给栈顶地址赋上eax寄存器上的值,也就是99999999,在接着清空eax的值

       接下来的就跟上面的的sub指令和mov指令一样,实现了pop指令的工作


call指令:先把下一条指令压到栈中,然后跳转到调用的地址
jmp指令:就是跳到调用的地址
retn指令:就是把call压入栈中的地址弹出,跳转到改地址执行

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值