IA-32常用传送指令
–通用数据传送指令
MOV:一般传送,包括movb、movw和movl等
MOVS:符号扩展传送,如movsbw、movswl等
MOVZ:零扩展传送,如movzwl、movzbl等
XCHG:数据交换
PUSH/POP:入栈/出栈,如pushl,pushw,popl,popw等
–地址传送指令
LEA:加载有效地址,如leal(%edx,%eax), %eax”的功能为R[eax]←R[edx]+R[eax],执行前,R[edx]=i,R[eax]=j,则指令执行后,R[eax]=i+j
–输入输出指令
IN和OUT:I/O端口与寄存器之间的交换
–标志传送指令
PUSHF、POPF:将EFLAG压栈,或将栈顶内容送EFLAG
- test.c
int add<stdio.h>
int add(int i,int j)
{
itn x=i+j;
return x;
}
传送指令具体执行过程
大致过程:
根据EIP取指令
指令译码
取操作数
指令执行
回写结果
修改EIP的值
从上述第一条指令开始
80483d4: 55
执行add时,起始EIP=0x80483d4。
(注:
PC:Program Counter,程序计数器,其功能是存放当前欲执行指令的地址,并可自动计数形成下一条指令地址。即此处的EIP。
ALU:Arithmetic Logic Unit,算术逻辑运算单元,为运算器的核心部件,其功能是进行算术、逻辑运算。
IR:Instruction Register,指令寄存器,其功能是存放当前正在执行的指令。
MAR:Memory Address Register,存储器地址寄存器,在主存中用来存放欲访问的存储单元的地址。
MDR:Memory Data Register,存储器数据缓冲寄存器,在主存中用来存放从某单元读出、或要写入某存储单元的数据)
- 取指令
指令的地址送到地址线送给存储器。
且控制器会发出一个读命令,送到控制线,告知存储器,要读该地址单元的内容
把地址中的内容读到数据线上面,读到MDR,送到指令寄存器IR里面,其中的高位OP字段送到控制器进行译码 - 译码
译码之后计算机就知道该指令的功能
是R[esp]<-R[esp]-4,M[R[esp]]<-R[ebp]
把esp的内容-4送到esp,然后把ebp的内容送到esp所指向的内存单元中去
即完成push操作 - 指令执行
esp在ALU计算送回esp
把esp的内容送到地址线
把要ebp的内容放到MDR中
把写控制信号送到控制线上 - PC(EIP)增量:
加上指令的长度,push指令只有一个字节,+1,EIP改为80483d5。然后继续执行下一条指令