3 程序的机器级表示
3.4 访问信息
32位之前仅有8个寄存器,而64位cpu包含一组16个存储64位值的寄存器(r8开始为64位新增寄存器)
64 | 32 | 16 | 8 | 含义 |
---|---|---|---|---|
%rax | %eax | %ax | %a1 | 返回值 |
%rbx | %ebx | %bx | %b1 | 被调用者保存 |
%rcx | %ecx | %cx | %c1 | 第4个参数 |
%rdx | %edx | %dx | %d1 | 第3个参数 |
%rsi | %esi | %si | %si1 | 第2个参数 |
%rdi | %edi | %di | %di1 | 第1个参数 |
%rdp | %edp | %dp | %dp1 | 被调用者保存 |
%rsp | %esp | %sp | %sp1 | 栈指针 |
%r8 | %r8d | %r8w | %r8b | 第5个参数 |
%r9 | %r9d | %r9w | %r9b | 第6个参数 |
%r10 | %r10d | %r10w | %r10b | 调用者保存 |
%r11 | %r11d | %r11w | %r11b | 调用者保存 |
%r12 | %r12d | %r12w | %r12b | 被调用者保存 |
%r13 | %r13d | %r13w | %r13b | 被调用者保存 |
%r14 | %r14d | %r14w | %r14b | 被调用者保存 |
%r15 | %r15d | %r15w | %r15b | 被调用者保存 |
对于生成小于8字节结果的指令,寄存器对此有两种规则:
- 生成1字节、2字节的指令会保存剩下的字节不变
- 生成4字节的指令会把高位4个字节置为0
3.4.1 操作数指示符
类型 | 格式 | 操作数值 | 名称 |
---|---|---|---|
立即数 | $Imm | Imm | 立即数寻址 |
寄存器 | r a r_a ra | R [ r a ] R[r_a] R[ra] | 寄存器寻址 |
存储器 | Imm | M [ I m m ] M[Imm] M[Imm](M表示从内存中寻址) | 绝对寻址 |
存储器 | ( r a ) (r_a) (ra) | M [ R [ r a ] ] M[R[r_a]] M[R[ra]] | 间接寻址 |
存储器 | I m m ( r b ) Imm(r_b) Imm(rb) | M [ I m m + R [ r b ] ] M[Imm+R[r_b]] M[Imm+R[rb]] | (基址+偏移量)寻址 |
存储器 | ( r b , r i ) (r_b,r_i) (rb,ri) | M [ R [ r b ] + R [ r i ] ] M[R[r_b]+R[r_i]] M[R[rb]+R[ri]] | 变址寻址 |
存储器 | I m m ( r b , r i ) Imm(r_b,r_i) Imm(rb,ri) | M [ I m m + R [ r b ] + R [ r i ] ] M[Imm+R[r_b]+R[r_i]] M[Imm+R[rb]+R[ri]] | 变址寻址 |
存储器 | ( , r i , s ) (,r_i,s) (,ri,s) | M [ R [ r i ] ∗ s ] M[R[r_i]*s] M[R[ri]∗s] | 比例变址寻址 |
存储器 | I m m ( , r i , s ) Imm(,r_i,s) Imm(,ri,s) | M [ I m m + R [ r i ] ∗ s ] M[Imm+R[r_i]*s] M[Imm+R[ri]∗s] | 比例变址寻址 |
存储器 | ( r b , r i , s ) (r_b,r_i,s) (rb,ri,s) | M [ R [ r b ] + R [ r i ] ∗ s ] M[R[r_b]+R[r_i]*s] M[R[rb]+R[ri]∗s] | 比例变址寻址 |
存储器 | I m m ( r b , r i , s ) Imm(r_b,r_i,s) Imm(rb,ri,s) | M [ I m m + R [ r b ] + R [ r i ] ∗ s ] M[Imm+R[r_b]+R[r_i]*s] M[Imm+R[rb]+R[ri]∗s] | 比例变址寻址 |