第一部分 基础知识
寄存器的组成
以16位的8086 CPU的寄存器为例,可分为三类。
通用寄存器
数据寄存器:AX(累加器),BX(基地址寄存器),CX(计数器寄存器),DX(数据寄存器)。均可当做两个独立的8位寄存器来使用。
指针寄存器:SP(堆栈指针寄存器)、BP(基指针寄存器)
变址寄存器:SI(源变址寄存器)、DI(目的变址寄存器)
控制寄存器
IP(指令指针寄存器),FLAG(标志寄存器)
段寄存器
CS(代码段寄存器),DS(数据段寄存器),SS(堆栈段寄存器),ES(附加段寄存器)
在32位中,一般会在开头加E;在64位中,般会在开头加R。
常用汇编指令
末位是 b 指8位,末位是 w 指16位,末位是 l 指32位,末位是 q 指64位
“从前往后看”
寄存器寻址: movl %eax, %edx;
立即寻址: movl $0x123, %edx;
直接寻址: movl 0x123, %edx;
间接寻址:movl (%eax), %edx;
变址寻址:movl 4(%eax), %edx;(在原地址上加4)
pushl %eax 相当于 subl $4, %esp; movl %eax, (%esp);
popl %eax 相当于 movl (%esp), %eax; subl $4, %esp;
第二部分 实验总结
:wq命令在按“ESC”后输入;注意g / .s*/的输入
实验分析
leave指令用于撤销函数堆栈,相当于movl %ebp, %esp; popl %ebp;
enter指令用于撤销函数堆栈,相当于pushl %ebp; movl %esp, %ebp;
要理解代码的含义是什么,首先要知道ESP、EBP、EIP寄存器中要存储的内容是什么,结合在学习C语言时堆栈的理解来理解。