c语言汇编call的参数,内嵌汇编—第7节:参数、局部变量、CALL原理

内嵌汇编—第7节:参数、局部变量、CALL原理

小风群:300275325

女神群:372452500(安卓,ISO,PC)全包揽,女神小敏期待你的加入哦。

这一节可能是大家最想明白的部分,想当初我为了了解这部分内容学了整个8086汇编,然而8086汇编中却没有说在WIN32环境中CALL的过程。或者是说在当前C语言流行时下,大部分软件都是C编写的,C编译器是如何处理子程序实现“小黑盒”的。下面请大家看仔细咯,说了那么多前面6节全是给这节做铺垫。(以下内容仅以WIN32汇编为主例,与8086汇编有些许不同)

EIP指令指针寄存器

看过前6节相信大家会有一个疑问?内存中那么多数据,哪些是可执行代码?哪些是数据?今天给大家介绍指令指针寄存器EIP,EIP是CPU中最关键的寄存器,它指示CPU当前要读取指令的地址。由此看来指令指针寄存器EIP直接决定了CPU要从哪里开始执行代码,那么正常情况下EIP指向的内存地址处存储的也必定是代码。

在CPU中程序员能够读写的部件只有寄存器,程序员可以通过改变寄存器的内容实现对CPU的控制。CPU从何处开始执行是由指令指针寄存器EIP(8086汇编中有“段”的概念指令指针由CS:IP组成,在Win32环境直接由EIP决定,具体请看第8节附录内容)决定的。程序员可以通过更改EIP中的内容来控制CPU执行目标指令。那么我们如何改变EIP中的内容呢?

有的童鞋可能会想到用Mov传送指令,如:mov eip,eax。但是呢Mov指令并不能更改EIP的内容,因为CPU没有这个功能。能够改变EIP内容的只有转移指令。在第5节中我们学过了多个转移指令如:Loop、Jmp、 Ja。。。。等等,它们实际上都通过修改了EIP的值来实现转移跳转。例如: jmp eax 就相当与:mov eip,eax

Call指令

Call指令也属于转移指令,它也是通过修改EIP的值实现转移的。但是它转移的过程略有不同,它的过程如:call eax等同于

push eip

jmp eax

在上节我为大家讲解了栈的概念,大家是否还记得,再把以上代码拆分开来,call指令做了以下几个动作。

sub esp,4

mov [esp],eip

jmp eax

为什么要将EIP入栈?在上一节有讲到,栈机制主要是为了保存现场,当我们调用一个子程序的时候,如果CPU直接跳到那个子程序去执行了,执行完以后,CPU就不知道要该去哪里执行了。如果我们在调用子程序之前记录好CPU执行的位置EIP,在子程序执行完毕后,再将之前的执行位置还原到EIP,那么是不是就可以继续执行下去呢?

Ret指令

相信大家对这个指令并不陌生,它的做用是返回。正如上面所说,ret指令就是将EIP还原。它如同执行了 POP EIP,它和CAll指令是配对使用的。所以在内嵌汇编编写子程序时,在子程序末尾一定要加上Ret指令。当Call指令调用子程序时,子程序才能正确返回。(小提示:由此看来EIP并不是完全不能由我们任意修改,通过修改栈中保存的EIP的值,在执行RET指令的时候将我们修改的值恢复到EIP,这样是不是达到见不得人目的??对于这种花样编程,在以后大家熟练以后可以去尝试下哦,比如通过这样的修改跳过某些代码,这样的做法会相

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值