Linux内核分析
通过学习蓝墨云班课上的视频对汇编有了初步的了解
- 通用寄存器
EAX:累加器
EBX:基地址寄存器
ECX:计数寄存器
EDX:数据寄存器
EBP:堆栈基址针
ESI、EDI:变址寄存器
ESP:堆栈顶指针 - 段寄存器
CS:代码段寄存器。
DS:数据段寄存器。
ES:附加段寄存器。
SS:堆栈段寄存器。
FS:附加段寄存器。
GS:附加段寄存器。 - mov指令及寻址方式
其中l指32位,b指8位,w指16位,q指64位
寄存器寻址:```
movl %eax,%edx
相当于edx=eax
**立即寻址**:```
movl $0x123,%edx
相当于 edx=0x123
直接寻址:```
movl 0x123,%edx
相当于edx=*(int32_t)0x123
**间接寻址**:```
movl (%ebx),%edx
相当于edx=(int32_t)ebx
变址寻址:```
movl 4(%ebx),%edx
相当于edx=(int32_t)(ebx+4) ,4就是寄存器ebx存的值加4
## 实验:反汇编一个简单的c程序
如果想把代码下载下来,就在Code目录下写代码:

通过命令```
$vi main.c
```进入vim输入c语言代码

通过:wq 保存退出
使用命令编译成汇编代码

通过命令```
$vi main.s
```查看汇编代码
去掉开头带“.”的辅助性语句,得到汇编代码图如下:

下面开始栈帧的分析


首先,从main程序开始执行→对ebp进行压栈→把esp赋予给ebp→esp向下减少4,赋予一个单元格→将数值4存储到单元格中→调用f函数→对ebp进行压栈→把esp赋予给ebp→esp向下增长4,赋予一个单元格→将ebp向上增加8对应单元格内的内容赋予给累加寄存器eax→将eax的内容赋予给esp→调用g函数→对ebp进行压栈→把esp赋予给ebp→将ebp向上增加8对应单元格内的内容赋予给累加寄存器eax→将eax储存的数加6→出栈→返回到f函数的leave命令→撤销函数堆栈→返回到主函数的leave命令→将eax储存的数加3→撤销函数堆栈→返回程序运行值。