x86-64数据格式、通用寄存器与操作数格式
数据格式
Intel用术语“字(word)”表示16位数据类型,32位为“双字(double words)”,64位数为“四字(quad words)”。
C声明 | Intel数据类型 | 汇编代码后缀 | 大小(字节) |
---|---|---|---|
char | 字节 | b | 1 |
short | 字 | w | 2 |
int | 双字 | l | 4 |
long | 四字 | q | 8 |
char* | 四字 | q | 8 |
float | 单精度 | s | 4 |
double | 双精度 | l | 8 |
大多数GCC生成的汇编代码指令都有一个字符的后缀,表明操作数的大小。
例如,数据传送指令有四个变种:movb(传送字节)、movw(传送字)、movl(传送双字)、movq(传送四字)。“l”表示双字时意为“长字(longword)”。后缀“l”既可表示四字节整数,也可表示双精度浮点数的原因是整数和浮点数使用的是完全不同的指令和寄存器,因此不会产生歧义。
通用寄存器
通用目的寄存器用于存储整数数据和指针。其名称与功能如下表所示:
63~0位 | 31~0位 | 15~0位 | 7~0位 | 用途 |
---|---|---|---|---|
%rax | %eax | %ax | %al | 返回值 |
%rbx | %ebx | %bx | %bl | 被调用者保存 |
%rcx | %ecx | %cx | %cl | 第4个参数 |
%rdx | %edx | %dx | %dl | 第3个参数 |
%rsi | %esi | %si | %sil | 第2个参数 |
%rdi | %edi | %di | %dil | 第1个参数 |
%rbp | %ebp | %bp | %bpl | 被调用者保存 |
%rsp | %esp | %sp | %spl | 栈指针 |
%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 | 被调用者保存 |
指令可以访问16个通用寄存器中的地位字节。
操作数格式
操作数的寻址有如下方式:
- 立即数,用来表示常数值,书写方式为'$'加标准C表示法表示的整数,如$-577或$0x1F。
- 寄存器,R[ra]表示ra寄存器的内容。
- 内存引用,M[Addr]表示地址为Addr的存储单元内的值
立即数Imm、基址寄存器rb、变址寄存器ri、比例因子s(其值为1、2、4、8)。
类型 | 格式 | 操作数值 | 名称 |
---|---|---|---|
立即数 | $Imm | Imm | 立即数寻址 |
寄存器 | ra | R[ra] | 寄存器寻址 |
存储器 | Imm | M[Imm] | 绝对寻址 |
存储器 | (ra) | M[R[ra]] | 间接寻址 |
存储器 | Imm(rb) | M[Imm+R[rb]] | (基址+偏移量)寻址 |
存储器 | (rb,ri) | M[R[rb]+R[ri]] | 变址寻址 |
存储器 | Imm(rb,ri) | M[Imm+R[rb]+R[ri]] | 变址寻址 |
存储器 | (,ri,s) | M[R[ri]*s] | 比例变址寻址 |
存储器 | Imm(,ri,s) | M[Imm+R[ri]*s] | 比例变址寻址 |
存储器 | (rb,ri,s) | M[R[rb]+R[ri]*s] | 比例变址寻址 |
存储器 | Imm(rb,ri,s) | M[Imm+R[rb]+R[ri]*s] | 比例变址寻址 |
例如:
%rax为寄存器寻址,(%rax)为间接寻址,$0x108为立即数寻址,0x104为绝对寻址。
由此可发现具有如下规律: