在函数里调用另外一个函数时, 原来fun的ebp值压栈。
退出时会做函数调用时的逆操作,内层函数是通过之前已经压栈了的调用函数时的下一条指令来得知返回地址的。
参数和返回地址按照某个约定顺序压入栈中。然后跳到目标代码。执行完之后。按照约定把这些信息清理出去,或者由调用方清理,看约定。把返回值放在寄存器或者栈中。恢复原来的位置,继续执行。所以需要保留的现场信息全部在栈里面。
如图所示共有四种不同的操作:leal 、一元操作、二元操作、位移操作。
算术与逻辑运算指令详解
加载有效地址
加载有效地址(load effective address)指令leal实际上是movl的变形。它的指令形式是从存储器读数据到寄存器,但实际上没有引用存储器。它的第一个操作数看上去是一个存储器引用,但该指令并不是从指定的位置读入数据,而是将有效地址写入到目的操作数。
如果寄存器%eax的值为x,那么指令leal 7(%edx, %edx, 4),%eax将设置寄存器%eax的值为5x+7.
一元操作和二元操作
一元操作:只有一个操作数,既是源又是目的,这个操作数可以是一个寄存器,也可以是一个存储器位置。
指令incl(%esp)会使栈顶的4字节元素加1,与C语言的自增,自减操作符有点类似。
二元操作:第二个操作数既是源又是目的,与C语言的赋值运算符类似,例如x+=y;不过,要注意,源操作数是第一个,目的操作数是第二个。
指令subl %eax, %edx :使寄存器%edx的值减去%eax的值。
位移操作
位移操作,先给出位移量,然后是待移位的值。可以进行算术和逻辑右移。
移位量可以是一个立即数,或者放在单字节寄存器元素%cl中。
左移指令有两个名字:SAL和SHL,两者效果一样,都是将右边填上0;右移指令不同,SAR执行算术移位(填上符号位),而SHR执行逻辑移位(填上0),移位操作的目的操作数可以是一个寄存器或者是一个存储器位置。
特殊的算术操作
imull指令:“双操作数”乘法指令,从两个32位操作数产生一个32位乘积。(补码乘法)
mull指令:无符号数乘法
这两个指令都要求一个参数必须在寄存器%eax中,而另一个作为指令的源操作数给出,然后乘机存放在寄存器%edx(高32位)和%eax(低32位)中。
idivl:有符号除法指令将寄存器%edx(高32位)和%eax(低32位)中的64位数作为被除数,而除数作为指令的操作数给出。指令将商存储在寄存器%eax中,将余数存储于寄存器%edx中。
什么是算术运算?什么是关系运算?什么是逻辑运算?
解答
算术运算、关系运算和逻辑运算是计算机运算中的基本运算方式。
算术运算是基本的数值运算,在C语言中有加、减、乘、除和除余五种。另外还有单项算术运算和前置运算和后置运算等变化。输出值还是数值。
关系运算主要是对两个 运算量进行大小 关系的比较,输入值为1或0两个逻辑值。

逻辑运算是表示运算量的逻辑关系,运算的结果也是1或者0.
各种运算在同一个算式中也有顺序问题,C语言的运算顺序比较复杂,有15个优先级。
条件码
条件码(condition code)寄存器。它与整数寄存器不同,它是由单个位组成的寄存器,也就是它们当中的值只能为 0 或者 1。当有算术与逻辑操作发生时,这些条件码寄存器当中的值会相应的发生变化。
整数寄存器,在 32位 CPU 中包含一组 8 个存储 32 位值的寄存器,即整数寄存器。它可以存储一些地址或者整数的数据,有的用来记录某些重要的程序状态,有的则用来保存临时数据。
常用的条件码如下:
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-54154-3.html
集体向520万刷起来集体心意送给烊烊生日礼物#易烊千玺##易烊千玺真的很不错##全员即刻加速1128迈#
虐
独一无二的小王子