1、冯·诺依曼体系结构
2、API:程序员与计算机的接口界面。
3、ABI:程序与CPU的接口界面。
1、X86寄存器
(1)8位:
低位:AL,BL,CL,DL
高位:AH,BH,CH,DH
(2)16位:AX,BX,CX,DX
(3)32位:
累加器:EAX
基地址寄存器:EBX
计数寄存器:ECX
数据寄存器:EDX
堆栈基指针:EBP
变址寄存器:ESI,EDI
堆栈顶指针:ESP
(4)段寄存器:
代码段寄存器:CS,代码段的段值
数据段寄存器:DS,数据段的段值
附加段寄存器:ES、FS、GS,附加数据段的段值
堆栈段寄存器:SS,堆栈段的段值
2、CPU在实际取指令时根据cs:eip来准确定位一个指令。
1、mov指令:
b,w,l,q分别代表8,16,32,64位
寄存器模式,以%开头的寄存器。
立即数是以$开头的数值。
(1)寄存器寻址:movl %eax,$edx edx=eax;
(2)立即寻址:movl $0x123,%edx edx=0x123;
(3)直接寻址:movl 0x123,%edx edx= *(int32_t*)0x123;
(4)间接寻址:movl (%ebx),%edx edx= *(int32_t)*edx;
(5)变址寻址:movl 4(%ebx),%edx edx=*(int32_t)(ebx+4);
2、Linux内核使用的是AT&T汇编格式,与Intel汇编格式略有不同。
3、eip寄存器不能被直接修改,只能通过特殊指令间接修改。
4、push指令
pushl %eax等价于:
subl $4,%esp
movl %eax,(%esp)
先栈顶指针esp减4,然后将eax寄存器的内容放入栈。
5、pop指令
pop %eax等价于:
movl (%esp),%eax
addl $4,%esp
先将eax寄存器的内容移出栈,然后栈顶指针esp加4。
6、call指令
call 0x12345等价于
pushl %eip
movl $0x12345,%eip(*)
先将eip压栈,然后将立即数0x12345放入eip。
eip是指令指针,所以它会从地址为0x12345开始取地址。
7、ret指令
ret等价于:popl %eip(*)
把call的时候保存的eip弹栈。
8、实例分析
1、存储程序计算机工作模型,计算机系统最最基础性的逻辑结构;
2、函数调用堆栈,高级语言得以运行的基础,只有机器语言和汇编语言的时候堆栈机制对于计算机来说并不那么重要,但有了高级语言及函数,堆栈成为了计算机的基础功能;
enter pushl %ebp movl %esp,%ebp leave movl %ebp,%esp popl %ebp
函数参数传递机制和局部变量存储
3、中断,多道程序操作系统的基点,没有中断机制程序只能从头一直运行结束才有可能开始运行其他程序。