Chapter 3 程序的机器级表示(上)

一、数据的存储(基本寄存器)

32位机器
32位机器寄存器
64位机器
64位机器寄存器
规律:
寄存器名为三位时,
①开头为r 代表8字节(64位),
②开头为e 代表4字节(32位)

当寄存器名为两位时,
③后缀为l 代表1字节(8位),
④其余都为2字节(16位)

rdi和rsi分别是函数调用时保存的第一个和第二个参数
rax通常保存返回值

二、数据的访问

源操作数:立即数、寄存器、内存单元
目的操作数:寄存器、内存单元
立即数:以 $ 开头
寄存器:以 % 开头。

“$Imm” 表示获取立即数
“%寄存器名” 表示获取xx寄存器中的内容

其余的所有方式都是获取内存中的内容,如直接使用立即数 Imm 时,该立即数表示地址,代表获取该地址对应的内存单元中的内容。

使用寄存器相对寻址时,括号中最多可以放置三个参数,外面可以放置一个立即数,最多4个参数,如上图中的最后一种情况其实包含了所有的情况。

Imm(Eb,Ej,s) -> M[Imm+R[Eb]+R[Ej] * s], 第二个参数和第三个参数是相乘的关系,一个寄存器中的值乘以一个整数,然后再加上第一个参数和前面的立即数。

练习题

操作数
%rax0x100
0x1040xAB
$0x1080x108
(%rax)0xFF (M[0x100])
4(%rax)0xAB (M[4+0x100])
9(%rax, %rdx)0x11 (M[0x100+0x3+9])
260(%rcx, %rdx)0x13 (M[260+0x1+0x3])
0xFC(,%rcx,4)0xFF (M[0x1*4+0xFC])
(%rax, %rdx, 4)0x11 (M[0x100+0x3*4])

三、数据传送指令

数据传送指令
等大小传送时只需加上字节大小的后缀如b、w、l、q。

大小不等时需要转换大小并使用符号扩展或者零扩展,分别是sxy和zxy。

可见如果大小不同时进行传送且不进行扩展操作就只会影响最低的几位,而高位不变。

补全后缀

数据传送代码示例

mov指令的操作数及操作

swap示例

四、算术与逻辑操作

算术与逻辑操作
lea作用
lea的作用是计算出一个地址并赋值到一个寄存器中。
Imm(%rax, %rdx, s)的区别是这个语句是指计算出对应的值之后直接到内存取这个地址单元的值,而lea接这个语句代表计算出地址后先不去取值,而是将对应的地址保存起来。

lea用来优化代码(乘法和加法):
lea用来优化代码lea用来优化代码2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值