天天看點

x86-64資料格式、通用寄存器與操作數格式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 表 示 法 表 示 的 整 數 , 如 '加标準C表示法表示的整數,如 ′加标準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為絕對尋址。

由此可發現具有如下規律:

x86-64資料格式、通用寄存器與操作數格式x86-64資料格式、通用寄存器與操作數格式

繼續閱讀