Chapter 3 目录
一、数据的存储(基本寄存器)
32位机器
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], 第二个参数和第三个参数是相乘的关系,一个寄存器中的值乘以一个整数,然后再加上第一个参数和前面的立即数。
练习题
操作数 | 值 |
---|---|
%rax | 0x100 |
0x104 | 0xAB |
$0x108 | 0x108 |
(%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的作用是计算出一个地址并赋值到一个寄存器中。
和Imm(%rax, %rdx, s)的区别是这个语句是指计算出对应的值之后直接到内存取这个地址单元的值,而lea接这个语句代表计算出地址后先不去取值,而是将对应的地址保存起来。
lea用来优化代码(乘法和加法):