学海拾遗:汇编语言实验

文章目录

  • 学海拾遗:汇编语言实验
    • 1.简单汇编指令回顾
    • 2. 相关寄存器
    • 3.C语言源码
    • 4.汇编代码

1.简单汇编指令回顾

指令 解释 说明
movl %eax, %edx edx = eax register mode
movl $0x123, %edx edx = 0x123 immediate
movl 0x123, %edx edx = *(int32_t*)0x123 direct
movl (%ebp), %edx edx = *(int32_t*)ebp indirect
movl 4(%ebp), %edx edx = *(int32_t*)(ebp+4) displaced

b, w, l, q分别代表8位,16位, 32位, 64位

寄存器模式:以%开头的寄存器标示符

立即数:以$开头的数值

直接寻址:直接访问一个指定的内存地址的数据

间接寻址:将寄存器的值作为一个内存地址来访问内存

变址寻址:在间接寻址之时改变寄存器的数值

Example instruction

函数调用堆栈是理解C代码在CPU上执行的关键

pushl %eax

​ subl $4, %esp

​ movl %eax, (%esp)


popl %eax

​ movl (%esp), %eax

​ addl $4, %esp


call 0x12345

​ pushl %eip(*)

​ movl $0x12345, %eip(*)

(*)表示eip寄存器不能被直接修改, 只能通过特殊指令间接修改

call指令:

  1. 将eip中的下一条指令的地址A保存在栈顶

  2. 设置eip指向被调用程序代码开始处


ret

​ popl %eip(*)


enter

​ pushl %ebp

​ movl %esp, %ebp


leave

​ movl %ebp, %esp

​ popl %ebp

2. 相关寄存器

计算机三大法宝:存储程序计算机、函数调用堆栈和中断机制

堆栈: C语言程序运行时必须的一个记录调用路径和参数的空间

  • 函数调用框架

  • 传递参数

  • 保存返回地址

  • 提供局部变量空间

C语言编译器对堆栈的使用有一套的规则

了解堆栈存在的目的和编译器对堆栈的使用的规则是理解操作系统一些关键性代码的基础

堆栈相关的寄存器

  • esp, 堆栈指针(Stack pointer)
  • ebp, 基址指针 (base pointer)

堆栈操作

  • push 栈顶地址减少4个字节, 32位
  • pop 栈顶地址增加4个字节

ebp在C语言中用作记录当前函数调用基址

其他关键寄存器

cs: eip: 总是指向下一条的指令地址

  • 顺序执行:总是指向地址连续的下一条指令
  • 跳转/分支:执行这样的指令的时候,cs:eip的值会根据程序的需要被修改
  • call:将当前cs:eip的值压入栈顶,cs: eip指向被调用函数的入口地址
  • ret: 从栈顶弹出原来保存在这里的cs:eip的值,放入cs:eip中

中断机制

3.C语言源码

// main.c
#include <stdio.h>
int g(int x)
{return x+5;
}
int f(int x)
{return g(x);
}
int main(void)
{return f(8) + 10;
}

4.汇编代码

gcc -S main.c -o main.s -m32
-m32编译选项报错时,Ubuntu下执行sudo apt-get install libc6
打开main.s文件删除所有以点开头的内容,剩下来的就纯汇编代码

zbb@ubuntu:~/ProC$ gcc -S main.c -o main.s -m32
In file included from /usr/include/stdio.h:27:0,from main.c:1:
/usr/include/features.h:367:25: fatal error: sys/cdefs.h: 没有那个文件或目录
compilation terminated.
zbb@ubuntu:~/ProC$ sudo apt-get install libc6g:pushl   %ebpmovl    %esp, %ebpmovl  8(%ebp), %eaxaddl   $5, %eaxpopl    %ebpret
f:pushl %ebpmovl    %esp, %ebppushl 8(%ebp)call gaddl   $4, %espleaveret
main:pushl  %ebpmovl    %esp, %ebppushl $8call  faddl   $4, %espaddl    $10, %eaxleaveret

函数的返回值默认使用eax寄存器存储返回给上一级函数

call f ==> pushl eip; movl f eip


具体执行过程见下图:



学海拾遗:汇编语言实验相关推荐

  1. 汇编语言 实验10.1 显示字符串

    汇编语言 实验10.1 显示字符串 问题 显示字符串是现实生活中经常要用到的功能,应该编写一个通用的子程序来实现这个功能.我们应该提供灵活的调用接口,是调用者可以决定显示的位置(行.列).内容和颜色. ...

  2. 8086汇编学习小记-王爽汇编语言实验12

    8086汇编学习小记-王爽汇编语言实验12 0号中断处理程序,开始安装在0000:0200处的程序最后用死循环导致显示不出'divided error',改成直接退出就正常显示了.注意修改ss,sp之 ...

  3. 汇编语言实验八核心考点

    汇编语言实验八核心考点 建议先自己思考问题的答案,不懂则返回看书 分析程序,在运行前思考:这个程序是否能够正确返回? 运行之后再思考:为什么是这种结果? 解析: 核心考点, CPU在执行jmp指令的时 ...

  4. 汇编语言实验十完整代码和详细解析

    汇编语言实验十完整代码和详细解析 建议先自己思考问题的答案,不懂则返回看书 扩展建议: [非必要内容,个人经验感悟] 从这儿开始,我们正式接触子程序,主要是通过 call和 ret 来实现的.这样就涉 ...

  5. 51单片机汇编语言实验(三)-----定时/计数器实验(附参考代码及注释)

       本系列共6篇文章,本文作为本系列的第三篇文章,介绍实验三 :定时/计数器实验,本系列文章基于Dais-52PRO实验箱. 本系列文章链接: --------------------------- ...

  6. 51单片机汇编语言实验(五)-----A/D 0809模数转换和DA0832数模转换实验(附参考代码及注释)

       本系列共6篇文章,本文作为本系列的第五篇文章,介绍实验五 :A/D 0809模数转换和DA0832数模转换实验,本系列文章基于Dais-52PRO实验箱. 本系列文章链接: ---------- ...

  7. 云南大学信息学院c语言实验七,云南大学软件学院汇编语言实验报告七.docx

    云南大学软件学院汇编语言实验报告七.docx 练习统计男女生人数1.实验内容统计一个有10人的班中,男.女生的人数各为多少.将统计结果的男生人数存入变量MAN中,女生人数存入变量WOMAN中.3.编程 ...

  8. 利用c51进行数模转换并在液晶屏上显示_51单片机汇编语言实验(五)-----A/D 0809模数转换和DA0832数模转换实验(附参考代码及注释)...

    本系列共6篇文章,本文作为本系列的第五篇文章,介绍实验五 :A/D 0809模数转换和DA0832数模转换实验,本系列文章基于Dais-52PRO实验箱. 本系列文章链接: ------------- ...

  9. 汇编语言实验12完整代码及详细解析

    汇编语言实验12完整代码及考察点 建议先自己思考问题的答案,不懂则返回看书 很简单的一个程序,不做额外的分析,看代码就懂了.本章主要是理解中断的过程.原理. assume cs:code code s ...

最新文章

  1. (C++)1037 在霍格沃茨找零钱的两种解法
  2. 3x3,5x5,7x7,9x9卷积核性能比较
  3. OpenCASCADE:使用扩展数据交换 XDE之特性
  4. 判断当前时间是否在某个时间范围内
  5. oracle 随笔数,Oracle数据库随笔
  6. 数据库工作笔记012---mysql触发器trigger 实例详解_保证数据库完整性还是不错的
  7. Windows 环境下配置 Oracle 11gR2 Data Guard 手记
  8. android不是16位,16位图像和Android处理
  9. 软件质量保证与测试(秦航第二版)第二章
  10. Python 数据分析 —— Matplotlib ①
  11. oracle 密码过期处理
  12. 数据结构_树与二叉树总结
  13. sox处理mp3_sox的常用方法
  14. html书签导入苹果,如何把360浏览器的收藏书签导入safari浏览器里
  15. springDataJpa @Query注解多条件动态模糊分页查询,传入形参对象
  16. 电视剧看合适的即可发生的方式根深蒂固
  17. 云计算服务在零售行业的革命性作用
  18. 2020Android开发常用的开源框架、开源库
  19. python+nodejs+vue的校园二手交易平台django项目源码
  20. 解决turf.js裁剪multiPolygon类型的复杂带孔洞多边形时出现的问题

热门文章

  1. 世茂集团稳健财务带领企业迈向高质量发展
  2. 协方差矩阵和矩阵相关系数的理解
  3. 上海市一级计算机ps,上海市计算机一级考试ps部分练习题.docx
  4. Python读取文本文件的几种方式
  5. PTA 天梯赛 L1-7 天梯赛的善良 (20 分)
  6. Android 获取摄像头像素,个数
  7. windows 建立窗口的程序代码
  8. forward完美转发
  9. 搜网页显示未连接上服务器是什么,【科普君】网页搜索时,出现“404”到底是什么意思?...
  10. android 观察者模式