inc si指令的作用_C|函数调用、汇编指令、栈空间及操作
函数是任何编程语言不可缺少的语法机制,函数通常包括函数声明、定义、调用。调用及多层嵌套调用时会有一个回溯的问题,也就是回到原来函数调用的位置,如何实现呢,使用栈的后进先出机制。类似于你去一个地方,经过了n个叉路口,你在每个叉路口用一个信封标识你选择的路线,叠在一起,返回时,依次从上面取出信封,按信封标识的信息即可回到起始点。
我们知道,计算机识别的是0、1串的机器语言表示的CPU指令集,0、1串抽象为字符版就是汇编指令及其语法机制,由汇编器翻译。汇编指令的进一步抽象就是高级语言指令及语法机制,由编译器或解释器翻译。
了解高级语言的函数调用,对应的汇编指令、栈空间及操作,可以更好地理解程序的运行机制。
我们知道,数据及指令的存储在计算机系统概念中是一个分层的体系结构,由内到外依次是C寄存器(晶体管实现的循环电路)、CPU缓存(SRAM,晶体管实现的双稳态电路)、内存(DRAM,电容存储,需周期刷新充电)、硬盘缓存、硬盘(机械、磁存储)等外部存储,各层离CPU由近到远,速度由快到慢。
一、常用寄存器
EAX(accumulator):通用寄存器。相对其他寄存器,在进行运算方面比较常用。在保护模式中,也可以作为内存偏移指针(此时,DS作为段寄存器或选择器)
EBX(base):通用寄存器。通常作为内存偏移指针使用(相对于EAX、ECX、EDX),DS是默认的段寄存器或选择器。在保护模式中,同样可以起这个作用。
ECX(count):通用寄存器。通常用于特定指令的计数。在保护模式中,也可以作为内存偏移指针(此时,DS作为寄存器或段选择器)。
EDX(data):通用寄存器。在某些运算中作为EAX的溢出寄存器(例如乘、除)。
SI(Source Index):源变址寄存器 ,通常在内存操作指令中作为“源地址指针”使用。当然,ESI可以被装入任意的数值,但通常没有人把它当作通用寄存器来用。
EDI(Destination Index):通常在内存操作指令中作为“目的地址指针”使用。当然,EDI也可以被装入任意的数值,但通常没有人把它当作通用寄存器来用。ES是默认段寄存器或选择器。
EBP(Base Pointer)和ESP(Stack Pointer):作为指针的寄存器,也可作为16位寄存器BP, SP使用,常用于椎栈操作。通常,它被高级语言编译器用以建造‘堆栈帧'来保存函数或过程的局部变量。
EIP是一个32位宽的寄存器,同CS一同指向即将执行的那条指令的地址,存放指令的偏移地址。微处理器工作于实模式下,EIP是IP(16位,Instruction Pointer,指令指针寄存器 )寄存器。不能够直接修改这个寄存器的值,修改它的方法是跳转或分支指令。(CS(Code Segment)代码段寄存器 )
二、汇编语言命令
1、mov——传送指令
定义:把一个字节、字或双字的操作数从源位置传送到目的位置,可以实现立即数到通用寄存器或主存的传送,通用寄存器与通用寄存器、主存或段寄存器之间的传送,主存与段寄存器之间的传送。
举例:mv ebp, esp
解释:相当于C语言中赋值语句=,ebp=esp
2、push——进栈指令
定义:进栈指令push先将ESP减小作为当前栈顶,然后可以将立即数、通用寄存器和段寄存器或存储器操作数传送到当前栈顶。
格式:push src
举例:push ebp
解释:相当于C语言中esp+=4, *esp=ebp
作用:为ebp当前存放的地址,在栈顶开辟空间存入它,用作调用子函数时的现场保护
3、pop——出栈指令
定义:与入栈指令相反,它先将栈顶的数据传送到通用寄存器、存储单元或段寄存器中,然后ESP增加作为当前栈顶。
格式:pop src
举例:pop ebp
解释:相当于C语言中 ebp=*esp, esp+=4
作用:调用子函数结束后,恢复主函数的ebp
4、add——加法指令
格式:add dest, src
解释:相当于dest+=src
5、sub——减法指令
格式:sub dest, src
解释:相当于dest-=src
6、call——函数调用指令
格式:call 函数名
作用:(1)将程序当前执行的位置IP压入堆栈中;(2)转移到调用的子程序。
三、函数调用实例
#include using namespace std;int d=11;int add(int a, int b) {int c=a+b; return c;}int main() { int x=10; int y=20; int z=add(x,y)+d; return 0; }
![](/assets/blank.gif)
四、函数调用实例与汇编代码
1: #include 2: using namespace std;3: int d=11;4: int add(int a, int b)5: {00401250 push ebp//栈底指针寄存器ebp入栈00401251 mov ebp,esp// ebp=esp(栈(顶)指针寄存器)00401253 sub esp,44h// esp-=44h00401256 push ebx// "基地址"(base)寄存器00401257 push esi//源通用寄存器00401258 push edi//目的通用寄存器00401259 lea edi,[ebp-44h]//把ebp-44h加载到edi中,目的是保存局部变量的区域0040125C mov ecx,11h 00401261 mov eax,0CCCCCCCCh //0xCCCCCCCC代表着未被初始化00401266 rep stos dword ptr [edi]//rep是重复其上面的指令,ECX是重复的次数//STOS指令将eax中的值拷贝到ES:EDI指向的地址6: int c=a+b;00401268 mov eax,dword ptr [ebp+8] //是指将ebp偏移8个字节的指针对应的4个字节赋给eax0040126B add eax,dword ptr [ebp+0Ch]0040126E mov dword ptr [ebp-4],eax7: return c;00401271 mov eax,dword ptr [ebp-4]8: }00401274 pop edi00401275 pop esi00401276 pop ebx00401277 mov esp,ebp00401279 pop ebp0040127A ret--- No source file ------------------------------------------------------------------------------0040127B int 3……--- F:WebsiteotesVC语法estest.cpp -------------------------------------------------------9:10: int main()11: {00401290 push ebp00401291 mov ebp,esp00401293 sub esp,4Ch00401296 push ebx00401297 push esi00401298 push edi00401299 lea edi,[ebp-4Ch]0040129C mov ecx,13h004012A1 mov eax,0CCCCCCCCh004012A6 rep stos dword ptr [edi]12: int x=10;004012A8 mov dword ptr [ebp-4],0Ah13: int y=20;004012AF mov dword ptr [ebp-8],14h14: int z=add(x,y)+d;004012B6 mov eax,dword ptr [ebp-8]004012B9 push eax004012BA mov ecx,dword ptr [ebp-4]004012BD push ecx004012BE call @ILT+0(add) (00401005)004012C3 add esp,8004012C6 add eax,dword ptr [d (00434dc0)]004012CC mov dword ptr [ebp-0Ch],eax15: return 0;004012CF xor eax,eax16: }004012D1 pop edi004012D2 pop esi004012D3 pop ebx004012D4 add esp,4Ch004012D7 cmp ebp,esp004012D9 call __chkesp (004081b0)004012DE mov esp,ebp004012E0 pop ebp004012E1 ret
-End-
inc si指令的作用_C|函数调用、汇编指令、栈空间及操作相关推荐
- ARM汇编指令(ARM寻址方式、汇编指令、伪指令
1.寻址方式 所谓寻址方式就是:处理器根据指令中给出的地址信息来寻找物理地址的方法. 1)立即寻址 立即寻址也叫立即数寻址,这是一种特殊的寻址方式,操作数本身就是在指令中给出的. 只要取出指令也就是取 ...
- c语言进位加汇编指令,共同学习hcs08的汇编指令,快速掌握
简单的介绍,hcs08的指令集,能够看懂c代码的汇编编译,方便硬件调试. 常用的伪指令: 1. 伪地址 ORG $C000 ;定义中断时用到 2. 伪字节 FCB $01,,$02,$03 : 3.伪 ...
- 汇编指令mrs_专题1:电子工程师 之 软件】 之 【8.arm指令】
希望本是无所谓有,无所谓无的,这正如脚下的路,其实地上本没有路,走的人多了,也便成了路....原创不易,文章会持续更新,感谢您的关注 1.伪指令和指令之间的差别 指令是CPU机器码的助记符,它经过编译 ...
- 逆向中常见寄存器及常用汇编指令
寄存器 通用寄存器 (前八个) 32位 16位 作用 EAX(累加器) AX 作用于操作数和结果的数据 EBX(基址寄存器) BX DS段中的数据指针 ECX(计数器) CX 用于字符串和循环操作 E ...
- arm汇编指令——分析问题的利器
文章目录 arm汇编指令为什么重要 1. 主导问题 2. arm汇编指令分类介绍 通用寄存器 状态寄存器 数据转移指令 寻址格式 运算指令 比较指令 跳转指令 3. 反汇编接口 4. 反汇编分析举例 ...
- arm学习之基本汇编指令
文章目录 1. 汇编文件中的主要符号 1.1 汇编指令 1.2 伪指令 1.3 伪操作 2. 汇编指令的分类 3. 基本汇编指令语法格式 4. 数据操作指令 4.1 数据搬移指令 4.1.1 指令格式 ...
- STM32单片机-汇编指令2
目录: 11.STMFD和LDMFD指令 1)STMFD SP! ,{R0-R7,LR} 2)LDMFD SP! ,{R0-R7,LR} 99.伪指令 1)PROC伪指令 2)EXPORT伪指 ...
- java 汇编_大话+图说:Java 汇编指令——只为让你懂
原标题:大话+图说:Java 汇编指令--只为让你懂 前言 随着Android开发技术不断被推到新的高度,对于Android程序员来讲越来越需要具备一些对深入的基础性的技术的理解,比如说Java汇编指 ...
- 汇编学习笔记——汇编指令
目录 汇编指令 nop指令 mov.add.sub指令 adc.sbb指令 and.or指令 移位指令 逻辑左/右移指令 循环左/右移指令 算术左/右移指令 带进位循环左/右移指令 inc指令 pus ...
最新文章
- 生成随机验证图片--ASP.NET中常用代码之二
- JavaWeb+SVN+Maven+Tomcat +jenkins实现自动化部署
- Azure负载均衡器Standard Load Balancer介绍
- Tensorflow学习-工具相关
- [小技巧]EF Core中如何获取上下文中操作过的实体
- matlab bwlabel标记连通区域
- vue报错 TypeError: merge is not a function
- 软件工程结构化建模的方法和工具_软件工程导论知识点梳理之概念题
- 骨牌覆盖(51Nod-1031)
- Coding and Paper Letter(五十七)
- Bzoj3653 谈笑风生
- 网络爬虫Matplotlib
- centos7搭建ftp服务
- 关于联合体union的详细解释
- SpringCloud之利用FTL生成Word报表并下载
- 1 MySQL8绿色版
- 步入社会的第一个迷茫期
- 微信小程序实现首行缩进、取消首行缩进
- Dell BIOS/CMOS设置诠释
- 图片转换成pdf格式如何转换?
热门文章
- 转 利用Ajax实现长连接 模拟推送,半长连接
- 用Power BI对超市数据进行分析
- shopex木马 shopex快照木马清除
- 经济金融英语术语汉英对照表
- 组织行为学-年轻团队太难带?“游戏化管理”疗效好、见效快
- 祝贺:奈雪的茶创始人彭心荣获“深圳首届十大金口碑人物”称号
- 学习Linux务必要打好基础
- php onsubmit方法,表单元素的submit()方法和onsubmit事件应用概述
- win10服务器未能登录怎么办,win10系统开机提示Group policy Client服务未能登陆的解决技巧...
- C++ 中 ZeroMemory、memset 危险需慎用