代码改变世界

2017-2018-1 20179226《Linux内核原理与分析》第二周作业

2017-10-07 21:08  20179226任逸飞  阅读(164)  评论(1编辑  收藏

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目录下写代码:
![](http://images2017.cnblogs.com/blog/1249682/201710/1249682-20171007105523677-607763477.png)
通过命令```
$vi main.c
```进入vim输入c语言代码
![](http://images2017.cnblogs.com/blog/1249682/201710/1249682-20171007110135958-1852955172.png)
通过:wq 保存退出
使用命令编译成汇编代码
![](http://images2017.cnblogs.com/blog/1249682/201710/1249682-20171007110542615-747867936.png)
通过命令```
$vi main.s
```查看汇编代码
去掉开头带“.”的辅助性语句,得到汇编代码图如下:
![](http://images2017.cnblogs.com/blog/1249682/201710/1249682-20171007111754943-495056827.png)
下面开始栈帧的分析
![](http://images2017.cnblogs.com/blog/1249682/201710/1249682-20171007123305193-1231778237.png)
![](http://images2017.cnblogs.com/blog/1249682/201710/1249682-20171007123319333-594475493.png)
首先,从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→撤销函数堆栈→返回程序运行值。