x86 64數據格式、通用寄存器與操作數格式 數據格式 Intel用術語“字(word)”表示16位數據類型,32位為“雙字(double words)”,64位數為“四字(quad words)”。 | C聲明 | Intel數據類型 | 彙編代碼尾碼 | 大小(位元組) | | : : | : ...
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為絕對定址。
由此可發現具有如下規律: