IA-32传送指令执行

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;
}

1

传送指令具体执行过程

大致过程:
根据EIP取指令
指令译码
取操作数
指令执行
回写结果
修改EIP的值

从上述第一条指令开始

80483d4: 55

执行add时,起始EIP=0x80483d4。

2

(注:
PC:Program Counter,程序计数器,其功能是存放当前欲执行指令的地址,并可自动计数形成下一条指令地址。即此处的EIP。
ALU:Arithmetic Logic Unit,算术逻辑运算单元,为运算器的核心部件,其功能是进行算术、逻辑运算。
IR:Instruction Register,指令寄存器,其功能是存放当前正在执行的指令。
MAR:Memory Address Register,存储器地址寄存器,在主存中用来存放欲访问的存储单元的地址。
MDR:Memory Data Register,存储器数据缓冲寄存器,在主存中用来存放从某单元读出、或要写入某存储单元的数据)

  • 取指令
    指令的地址送到地址线送给存储器。
    且控制器会发出一个读命令,送到控制线,告知存储器,要读该地址单元的内容
    把地址中的内容读到数据线上面,读到MDR,送到指令寄存器IR里面,其中的高位OP字段送到控制器进行译码
  • 译码
    3译码之后计算机就知道该指令的功能
    是R[esp]<-R[esp]-4,M[R[esp]]<-R[ebp]
    把esp的内容-4送到esp,然后把ebp的内容送到esp所指向的内存单元中去
    即完成push操作
  • 指令执行
    4esp在ALU计算送回esp
    把esp的内容送到地址线
    把要ebp的内容放到MDR中
    把写控制信号送到控制线上
  • PC(EIP)增量:
    加上指令的长度,push指令只有一个字节,+1,EIP改为80483d5。然后继续执行下一条指令

猜你喜欢

转载自blog.csdn.net/weixin_61631200/article/details/127348661