CSAPP

时间:2020-07-19 23:09:41   收藏:0   阅读:101

Chapter 3 程序的机器级表示

程序编码

计算机执行机器代码(对操作的字节序列编码),编译器:源代码->可执行代码

汇编代码是机器代码的文本表示,与特定的机器密切相关

GCC C 编译器:

程序内存通过虚拟地址来寻址,操作系统负责管理虚拟地址以及虚拟地址到物理地址的对应,目前x86-64的虚拟地址的高16位设置为0,寻址范围2^48内的一个字节

反汇编器:机器代码->类似汇编代码的格式

机器代码和反汇编表示的特性:

汇编代码格式:AT&T 和 Intel

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

转移类指令源和目的操作数的五种可能的组合为:

不支持其他的组合,其中Register->Register的情况,源寄存器和目的寄存器的符号都需要与转移字节的size相符

数据传送指令的实现

压入和弹出栈操作

栈是后进先出的结构,由高地址向低地址扩展

//UNDONE

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!