学海拾遗:汇编语言实验
学海拾遗:汇编语言实验
文章目录
- 学海拾遗:汇编语言实验
- 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指令:
将eip中的下一条指令的地址A保存在栈顶
设置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
具体执行过程见下图:
学海拾遗:汇编语言实验相关推荐
- 汇编语言 实验10.1 显示字符串
汇编语言 实验10.1 显示字符串 问题 显示字符串是现实生活中经常要用到的功能,应该编写一个通用的子程序来实现这个功能.我们应该提供灵活的调用接口,是调用者可以决定显示的位置(行.列).内容和颜色. ...
- 8086汇编学习小记-王爽汇编语言实验12
8086汇编学习小记-王爽汇编语言实验12 0号中断处理程序,开始安装在0000:0200处的程序最后用死循环导致显示不出'divided error',改成直接退出就正常显示了.注意修改ss,sp之 ...
- 汇编语言实验八核心考点
汇编语言实验八核心考点 建议先自己思考问题的答案,不懂则返回看书 分析程序,在运行前思考:这个程序是否能够正确返回? 运行之后再思考:为什么是这种结果? 解析: 核心考点, CPU在执行jmp指令的时 ...
- 汇编语言实验十完整代码和详细解析
汇编语言实验十完整代码和详细解析 建议先自己思考问题的答案,不懂则返回看书 扩展建议: [非必要内容,个人经验感悟] 从这儿开始,我们正式接触子程序,主要是通过 call和 ret 来实现的.这样就涉 ...
- 51单片机汇编语言实验(三)-----定时/计数器实验(附参考代码及注释)
本系列共6篇文章,本文作为本系列的第三篇文章,介绍实验三 :定时/计数器实验,本系列文章基于Dais-52PRO实验箱. 本系列文章链接: --------------------------- ...
- 51单片机汇编语言实验(五)-----A/D 0809模数转换和DA0832数模转换实验(附参考代码及注释)
本系列共6篇文章,本文作为本系列的第五篇文章,介绍实验五 :A/D 0809模数转换和DA0832数模转换实验,本系列文章基于Dais-52PRO实验箱. 本系列文章链接: ---------- ...
- 云南大学信息学院c语言实验七,云南大学软件学院汇编语言实验报告七.docx
云南大学软件学院汇编语言实验报告七.docx 练习统计男女生人数1.实验内容统计一个有10人的班中,男.女生的人数各为多少.将统计结果的男生人数存入变量MAN中,女生人数存入变量WOMAN中.3.编程 ...
- 利用c51进行数模转换并在液晶屏上显示_51单片机汇编语言实验(五)-----A/D 0809模数转换和DA0832数模转换实验(附参考代码及注释)...
本系列共6篇文章,本文作为本系列的第五篇文章,介绍实验五 :A/D 0809模数转换和DA0832数模转换实验,本系列文章基于Dais-52PRO实验箱. 本系列文章链接: ------------- ...
- 汇编语言实验12完整代码及详细解析
汇编语言实验12完整代码及考察点 建议先自己思考问题的答案,不懂则返回看书 很简单的一个程序,不做额外的分析,看代码就懂了.本章主要是理解中断的过程.原理. assume cs:code code s ...
最新文章
- (C++)1037 在霍格沃茨找零钱的两种解法
- 3x3,5x5,7x7,9x9卷积核性能比较
- OpenCASCADE:使用扩展数据交换 XDE之特性
- 判断当前时间是否在某个时间范围内
- oracle 随笔数,Oracle数据库随笔
- 数据库工作笔记012---mysql触发器trigger 实例详解_保证数据库完整性还是不错的
- Windows 环境下配置 Oracle 11gR2 Data Guard 手记
- android不是16位,16位图像和Android处理
- 软件质量保证与测试(秦航第二版)第二章
- Python 数据分析 —— Matplotlib ①
- oracle 密码过期处理
- 数据结构_树与二叉树总结
- sox处理mp3_sox的常用方法
- html书签导入苹果,如何把360浏览器的收藏书签导入safari浏览器里
- springDataJpa @Query注解多条件动态模糊分页查询,传入形参对象
- 电视剧看合适的即可发生的方式根深蒂固
- 云计算服务在零售行业的革命性作用
- 2020Android开发常用的开源框架、开源库
- python+nodejs+vue的校园二手交易平台django项目源码
- 解决turf.js裁剪multiPolygon类型的复杂带孔洞多边形时出现的问题