x86-64数据格式、通用寄存器与操作数格式

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为绝对寻址。

由此可发现具有如下规律:

posted @ 2019-07-18 21:13  shadowgully  阅读(2157)  评论(0编辑  收藏  举报