汇编语言快速入门学习笔记
程序计数器(PC)在x86-64中用%rip表示,其中给出了将要执行的下一条指令在内存中的地址
在Linux下查看汇编代码的两种方式:
- 对于一可执行文件hello,使用
objdump -d hello
即可在控制台打印其反汇编代码 - 在编译C代码时,使用gcc的-S参数生成汇编代码文件,可以用文本编辑器查看
gcc -Og -S hello.c -o hello.s
所有以
.
开头的行都是知道汇编器和链接器工作的伪指令,通常可以忽略。AT&T与Intel汇编代码格式:两种格式在许多方面不同,在gcc/objdump工具中默认格式是AT&T,使用下面的命令可以让GCC产生Intel格式的代码:
gcc -Og -S -masm=intel hello.c
操作数指示符:
其中,Imm表示立即数(immediate的缩写);R[]数组为寄存器内容数组,如R[r_a]即表示寄存器r_a中的值;M[]数组表示内存内容数组,如M[Imm]即表示内存第Imm号单元中存放的数据。各个寄存器的大小如下:
数据传送指令MOV类:包括movb, movw, movl, movq等指令,它们的区别在于操作数据的大小不同。
源操作数S指定的值是一个立即数(常数),存储在寄存器或内存中。目的操作数D指定一个位置,要么是一个寄存器,要么是一个内存地址。x86-64限制传送指令的两个操作数S和D不能都指向内存位置,两个内存位置间复制数据必须通过寄存器中转。记住,MOV A B指令中,源操作数在前,目标操作数在后,是把A复制到B中!
注意:源操作数只有以$开头的才是立即数,其它的以%开头的是表示寄存器中存放的数据,有括号的表示内存某一地址中的数据。目标操作数以%开头的表示某一寄存器,是将源操作数复制到这个寄存器中(不是按寄存器中保存的数据在内存中寻址);有括号的表示内存的一地址,是将源操作数复制到内存中这个地址对应的内存单元当中。
movb, movw, movl, movq都要求源操作数和目标操作数表示的数据大小相同,还有其他指令如movzbw,movzbl,movzwl,movzbq,movzwq,movsbw,movsbl,movswl,movsbq,movswq,movslq,cltq,是将较小的源值复制到较大的目的时使用,其中涉及到高位扩展填充(零扩展/符号扩展),这里不再详细解释。值得注意的是,如果源操作数的数据大小小于目标操作数表示的数据大小,movb, movw, movl, movq指令只会修改源操作数对应的位,不会修改其他的位,唯一的例外是movl(这是由于x86-64的惯例原因,这里不解释)。栈操作
在x86-64机器中,栈是向低地址方向增长的,也就是说,栈底的地址值更大。%rsp寄存器专门用于存储栈顶地址。故指令pushq %rbq
等价于两条指令subq $8,%rsp
和movq %rbq,(%rsp)
,指令popq %rax
等价于两条指令movq (%rsp),%rax
addq $8,%rsp
。算术运算
条件码
CMP和TEST指令
访问条件码(SET指令)
跳转指令
jmp跳转指令分直接跳转和简介跳转,直接跳转是给出一个标号作为跳转目标,间接跳转是"*"后跟一个操作数指示符(寄存器或内存地址)。如jmp *%rax
用寄存器rax中的值作为跳转目标,jmp *(%rax)
以%rax中的值作为读地址,从内存中读出跳转目标。
条件传送指令
8086中的寄存器:
(1) 8个通用寄存器:
数据寄存器
AX—Accumulator Register,累加寄存器
BX—Base Segment Register,基址寄存器
CX—Count Segment Register,计数寄存器
DX—Data Segment Register,数据寄存器字符串
地址指针寄存器
SI—Source Index Register,源变址寄存器
DI—Destination Index Register,目的变址寄存器
SP—Stack Pointer Register,堆栈寄存器
BP—Base Pointer Register,基址指针寄存器
(2) 6个段寄存器:
CS—Code Segment Register,代码段寄存器
DS—Data Segment Register,数据段寄存器
SS—Stack Segment Register,堆栈段寄存器
FS—Flag Segment Register,标志段寄存器
FS寄存器指向当前活动线程的TEB结构(线程结构)。
GS—Global Segment Register,全局段寄存器it
(3) 2个控制寄存器:
IP—Instruction Pointer,指令指针,即PC(Program counter),程序计数器。
PSW—Processor State Word,微处理器状态字
即在8086中,%rip就是PC,%rsp为栈顶指针转移控制(call,ret指令)
call指令有一个目标,即指明被调用过程起始的指令地址。调用可以是直接的(call Label),也可以是间接的(call *Operand)。一个call指令相当于一条push指令接一条jmp指令,先将原过程中call指令的下一条指令的地址push到栈中,再跳转到目标过程。而ret指令相当于一条pop指令接一条jmp指令,先从栈中弹出之前在栈中push的地址(即之前保存的"call的下一条指令的地址"),然后跳转到这个地址,完成ret指令,继续执行原过程。
汇编语言快速入门学习笔记相关推荐
- Java快速入门学习笔记9 | Java语言中的方法
有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...
- Java快速入门学习笔记8 | Java语言中的数组
有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...
- Java快速入门学习笔记7 | Java语言中的类与对象
有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...
- Java快速入门学习笔记6 | Java语言中的for循环语句
有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...
- Java快速入门学习笔记5 | Java语言中的while循环语句
有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...
- Java快速入门学习笔记4 | Java语言中的if条件语句
有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...
- Java快速入门学习笔记3 | Java语言中的表达式与操作符
有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...
- Java快速入门学习笔记2 | Java语言中的基本类型
有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...
- Java快速入门学习笔记1 | Eclipse使用
有人相爱,有人夜里开车看海,有人却连LeetCode第一题都解不出来!虽然之前系统地学习过java课程,但是到现在一年多没有碰过Java的代码,遇到LeetCode不知是喜是悲,思来想去,然后清空自己 ...
最新文章
- 使用CInternetSession和CHttpFile读取网页内容
- 互联网企业安全高级指南3.7.1 攻防驱动修改
- GitHub 报告显示香港码农大爆发,诚实的程序员:转行只因工资高!
- CuteEditor 编辑器的字体样式无法控制的问题解决
- Core Animation放大缩小;CAKeyframeAnimation
- hdu 5199 Gunner(STL之map,水)
- Kubernetes入门——深入浅出讲Docker
- SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问的解决方案...
- 时间模块,带Python示例
- 【蓝桥杯官网试题 -算法训练】素因子去重(数学,数论,因子约数)
- git代码托管 · 操作举例: “git bash here ”(全程操作讲解) - git命令篇
- java jsessionid 会话,如何使用JSESSIONID手动加载Java会话?
- 浙大 PAT b1052
- 深入了解C++变量类型有哪些
- 20162319莫礼钟 2016-2017-2 《程序设计与数据结构》第2周学习总结
- HTML期末大作业~ 仿新浪微博个人主页html网站模板4个页面(HTML+CSS+JavaScript)
- Linux磁盘管理及Lvm
- [1077]ZooKeeper下载安装(Windows版本)
- CSR867x — CSR蓝牙开发调试经验
- vite+ts+vue组合式api-c端-移动端项目(保姆级教学)
热门文章
- 云平台已经成为发生网络攻击的重灾区
- 一体化机柜在县级支行机房标准化建设中的应用
- 机房漏电产生的危害及安全隐患解决方案
- linux搭建宝塔重启mysql_宝塔面板安装 重启等命令linux系统重启
- 无限乱斗机器人ap出装_LOL:无限火力仅剩4天,这5个英雄一定要尝试!
- Interview:算法岗位面试—10.31下午上海某银行总部公司(二面,四大行之一)之项目简介、比赛介绍、某个比赛的过程
- DL之NN:利用(本地数据集50000张数据集)调用自定义神经网络network.py实现手写数字图片识别94%准确率
- 尝鲜delphi开发android/ios_环境搭建
- python3 获取cookie解决方案
- 第二阶段冲刺 第六天