程序的机器级表示:寻址方式、指令及栈的运行机制

程序的机器级表示

时隔一年把 CS:APP 再看一遍,尤其针对的运行机制加深理解。

访问信息

16个通用寄存器
一个 x86-64 CPU 包含一组16个存储64位值的通用目的寄存器。虽然是通用寄存器,但也有一些约定成俗的用法。r8 r9 ... 为80386之后扩展的8个寄存器

\(rax\), 返回值

\(rbx\), 被调用者保存

\(rcx\), 第4个参数

\(rdx\), 第3个参数

\(rsi\), 第2个参数

\(rdi\), 第1个参数

\(rbp\), 被调用者保存

\(rsp\), 指针。最为特殊, 用来指明栈的结束位置(栈顶)

\(r8\), 第5个参数

\(r9\), 第6个参数

\(r10\), 调用者保存

\(r11\), 调用者保存

\(r12\), 被调用者保存

\(r13\), 被调用者保存

\(r14\), 被调用者保存

\(r15\), 被调用者保存

操作数指令

大多数指令有一个或多个操作数(operand)指示出执行一个操作中要使用的源操作数,以及放置结果的目的操作数。根据源数据和目的位置的取值可分为三种类型

立即数(immediate), 用来表示常数值

寄存器(register), 表示某个寄存器的内容

内存引用, 根据计算出来的地址访问某个内存位置

多种寻址模式

在 ATT 格式的汇编代码中,立即数的写法为 \(\$\) 后跟一个标准 C 表示法的整数

用符号 \(r_a\) 来表示任意寄存器 \(a\), 用引用 \(R[r_a]\) 来表示它的值, 这里将寄存器集合看成一个数组,用寄存器标识符作为索引

将内存看作一个很大的字节数组,用符号 \(M_b[Addr]\) 表示对存储在内存中可以地址 \(Addr\) 开始的 \(b\) 个字节值的引用, 下表省略下标 \(b\)

类型 格式 操作数值 名称
立即数   $$Imm $   \(Imm\)   立即数寻址  
寄存器   \(r_a\)   \(R[r_a]\)   寄存器寻址  
存储器   \(Imm\)   \(M[Imm]\)   绝对寻址  
存储器   \((r_a)\)   \(M[R[r_a]]\)   间接寻址  
存储器   \(Imm(r_b)\)   \(M[Imm + R[r_a]]\)   (基址 + 偏移值)寻址  
存储器   \((r_b, r_i)\)   \(M[R[r_b] + R[r_i]]\)   变址寻址  
存储器   \(Imm(r_b, r_i)\)   \(M[Imm + R[r_b] + R[r_i]]\)   变址寻址  
存储器   \((, r_i, s)\)   \(M[R[r_i] \cdot s ]\)   比例变址寻址  
存储器   \(Imm(, r_i, s)\)   \(M[Imm + R[r_i] \cdot s ]\)   比例变址寻址  
存储器   $ (r_b, r_i, s)$   \(M[R[r_b] + R[r_i] \cdot s ]\)   比例变址寻址  
存储器   $ Imm(r_b, r_i, s)$   \(M[Imm + R[r_b] + R[r_i] \cdot s ]\)   比例变址寻址  
数据传输指令 指令 效果 描述
\(MOV \quad S, D\)   \(D \leftarrow S\)   传送  
\(movabsq \quad I, R\)   \(R \leftarrow I\)   传送绝对的四字  
\(MOVZ \quad S, R\)   \(R \leftarrow 零扩展(S)\)   以零进行扩展进行转送  
\(MOVS \quad S, R\)   \(R \leftarrow 符号扩展(S)\)   转送符号扩展的字节  
\(movsbw \quad S, R\)     将符号扩展的字节传送到字  
\(ctlq\)   \(\%rax \leftarrow 符号扩展(\%eax)\)   把 %eax 符号扩展到 %rax  
算术和逻辑操作指令 指令 效果 描述
\(leaq \quad S, D\)   \(D \leftarrow \&S\)   加载有效地址  
\(INC \quad D\)   \(D \leftarrow D + 1\)   加 1  
\(DEC \quad D\)   \(D \leftarrow D - 1\)   减 1  
\(NEG \quad D\)   \(D \leftarrow -D\)   取负  
\(NOT \quad D\)   \(D \leftarrow \sim D\)   取反  
\(ADD \quad S, D\)   \(D \leftarrow D + S\)    
\(SUB \quad S, D\)   \(D \leftarrow D - S\)    
\(IMUL \quad S, D\)   \(D \leftarrow D * S\)    
\(XOR \quad S, D\)   \(D \leftarrow D\) ^ \(S\)   异或  
\(OR \quad S, D\)   \(D \leftarrow D \mid S\)    
\(AND \quad S, D\)   \(D \leftarrow D \& S\)    
\(SAL \quad k, D\)   \(D \leftarrow D << k\)   左移  
\(SHL \quad k, D\)   \(D \leftarrow D << k\)   左移, 等同于 SAL  
\(SAR \quad k, D\)   \(D \leftarrow D >>_A k\)   算术左移(考虑符号)  
\(SHR \quad k, D\)   \(D \leftarrow D >>_L k\)   逻辑  
特殊的算术操作

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpygjw.html