标签:
CPU与内存通过总线连接,CPU中有很多寄存器(总是指向内存的某一块区域),如IP(Instruction Pointer)。假如指向CS(Code Segment,代码段),CPU从IP指向的内存的地址,取指令执行,执行过后IP自加1,取下一条指令,重复上述步骤。
CPU不断执行next instruction,从内存取指令不断执行。
内存保存数据和指令,CPU负责解释和执行指令。
cpu识别什么指令,怎么定义?
API:程序员与计算机的接口界面
ABI:程序与CPU的接口界面
CPU在实际取指令是根据cs:eip来确定一个指令
指令 | 含义 | 模式/模型 |
movl %eax,%edx | edx=eax | register mode,以%开头的寄存器标示符 |
movl $0x123,%edx | edx=0x12 | immediate,立即数以$开头的数值 |
movl 0x123(没有$符表示地址),%edx | edx=*(int32_t*)0x123 | direct,直接访问一个指定的内存地址的数据 |
movl (%ebx)(ebx寄存器存的值——内存地址,加括号表示内存地址存的数据放在ebx),%edx | edx=*(int32_t*)ebx | indirect,将寄存器的值作为一个内存地址来范围内存 |
movl 4(%ebx),%edx | edx=*(int32_t*)(ebx+4) | displaced,在间接寻址时改变寄存器的值 |
pushl %eax | subl $4,%esp | |
popl %eax | movl(%esp),%eax | |
call 0x12345(调用0x12345地址) | pushl %eip(*)(当前的eip压栈) | |
ret | popl %eip(*) | |
enter | pushl %ebp | |
leave | movl %ebp,%esp |
b,w,l,q分别代表8位,16位,32位,64位
eip指向内存的指令,自加一(一条指令),*代表这些指令不能被程序员直接使用,程序不能直接修改eip寄存器
#include <stdio.h>
int g(int x)
{
return x + 3;
}
int f(int x)
{
return g(x);
}
int main(void)
{
return f(8) + 1;
}
gcc -S -o main.s main.c -m32,对应的汇编代码
g:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
addl $3, %eax
popl %ebp
ret
f:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl 8(%ebp), %eax
movl %eax, (%esp)
call g
leave
ret
main:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl $8, (%esp)
call f
addl $1, %eax
leave
ret
动画演示:
标签:
原文地址:http://www.cnblogs.com/boyiliushui/p/5385106.html