行是知之始,知是行之成。这篇文章主要讲述CSAPP相关的知识,希望能为你提供帮助。
Chapter 3 程序的机器级表示
程序编码
计算机执行机器代码(对操作的字节序列编码),编译器:源代码->
可执行代码
汇编代码是机器代码的文本表示,与特定的机器密切相关
GCC C 编译器:
- C预处理器扩展源代码,插入以#include指定的文件以及用#define声明指定的宏定义
- 编译器生成汇编代码
- 汇编器把汇编代码转换成二进制目标代码(包含所有指令的二进制表示,但是尚未填入全局值的地址)
- 链接器将目标代码文件与实现库函数的代码合并,产生可执行代码文件
反汇编器:机器代码-> 类似汇编代码的格式
机器代码和反汇编表示的特性:
- x86-64的指令长度从1-15个字节不等,常用的指令以及操作数较少的指令所需的字节数较少,不太常用或操作数较多的指令所需要的字节数较多(尽量缩短平均指令译码时间)
- 从某个指定的位置开始,可以将字节唯一地解码成机器指令(设计指令格式)
Intel数据格式
文章图片
文章图片
文章图片
Intel数据传送指令
MOV类movb,movw,movl,movq
文章图片
作用:更新目的操作数指定的寄存器字节或者内存位置
注:x86-64中的内存引用总是用四字节的寄存器给出,例如%rax,不管是1,2,4还是8个字节
movq和movabsq的区别:movq指令只能以表示为32位补码数字的立即数作为源操作数,然后把该数符号扩展得到64位的值放到目的位置,movabsq指令能够以任意的64位立即数值作为源操作数,只能以寄存器为目的
例外:movl指令以寄存器为目的时,会把寄存器的高4位字节全部设置为0(x86-64惯例:任何为寄存器生成32位值的指令都会把寄存器的高位部分置0)
源操作数:立即数,存储在寄存器或者内存中
目的操作数:指定一个位置,寄存器/内存地址
x86-64限定传送指令的两个操作数不能都指向内存位置,将一个值从一个内存位置复制到另一个内存位置,必须中间通过一个寄存器
将较小源移动到较大的目的时:
MOVZ类movzbw,movzbl,movzbq,movzwl,movzwq(没有movzlq < => movl)
作用:对源数据的高位用0填充,然后复制到目的寄存器
MOVS类movsbw,movsbl,movsbq,movswl,movswq,movslq,cltq
作用:对源数据的高位用最高位填充,然后复制到目的寄存器
cltq指令把%eax符号扩展到%rax < => movslq%eax , %rax
转移类指令源和目的操作数的五种可能的组合为:
- Immediate-> Register
- Immediate-> Memory
- Register-> Register
- Register-> Memory
- Memory-> Register
数据传送指令的实现
- 间接引用指针(地址),就是将指针放在一个寄存器中,然后在内存引用中使用这个寄存器
- 局部变量保存在寄存器中,而不是内存中,因为访问寄存器比访问内存快得多
栈是后进先出的结构,由高地址向低地址扩展
【CSAPP】//UNDONE
推荐阅读
- call,apply,bind的区别
- SpringBoot获取ApplicationContext,再获取bean的名称
- IIS自带的http modules分别注册了HttpApplication pipeline里面的哪些事件
- android studio 如何升级sdk
- AndroidStudio 插件记录
- ANdroid Studio下载
- appium——微信小程序自动化
- appium-Hybird应用自动化
- [nowcoder5667H]Happy Triangle