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

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目录下写代码:
2017-2018-1 20179226《Linux内核原理与分析》第二周作业_第1张图片
通过命令$vi main.c进入vim输入c语言代码
2017-2018-1 20179226《Linux内核原理与分析》第二周作业_第2张图片
通过:wq 保存退出
使用命令编译成汇编代码

通过命令$vi main.s查看汇编代码
去掉开头带“.”的辅助性语句,得到汇编代码图如下:
2017-2018-1 20179226《Linux内核原理与分析》第二周作业_第3张图片
下面开始栈帧的分析

2017-2018-1 20179226《Linux内核原理与分析》第二周作业_第4张图片
首先,从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→撤销函数堆栈→返回程序运行值。

你可能感兴趣的:(2017-2018-1 20179226《Linux内核原理与分析》第二周作业)