IA-32平臺的寄存器:數組
寄存器 | 描述 |
通用 | 8個32位寄存器,用於存儲正在處理的數據 |
段 | 6個16位寄存器,用於處理內存訪問 |
指令指針 | 單一的32位寄存器,指向要執行的下一條指令碼 |
浮點數據 | 8個80位寄存器,用於浮點數學數據 |
控制 | 5個32位寄存器,用於肯定處理器的操做模式 |
調試 | 8個32位寄存器,用於在調試處理器時包含信息 |
IA-32平臺的通用寄存器(32位):函數
寄存器 | 描述 |
EAX | 用於操做數和結果數據的累加器 |
EBX | 指向數據內存段中的數據的指針 |
ECX | 字符串和循環操做的計數器 |
EDX | I/O指針 |
EDI | 用於字符串操做的目標的數據指針 |
ESI | 用於字符串操做的源的數據指針 |
ESP | 堆棧指針 |
EBP | 堆棧數據指針 |
IA-32平臺的段寄存器(16位):性能
段寄存器 | 描述 |
CS | 代碼段 |
DS | 數據段 |
SS | 堆棧段 |
ES | 附加段指針 |
FS | 附加段指針 |
GS | 附加段指針 |
IA-32平臺的控制寄存器:ui
控制寄存器 | 描述 |
CR0 | 控制操做模式和處理器狀態的系統標誌 |
CR1 | 當前沒有使用 |
CR2 | 內存頁面錯誤信息 |
CR3 | 內存頁面目錄信息 |
CR4 | 支持處理器特性和說明處理器特性能力的標誌 |
IA-32平臺的狀態標誌:spa
標誌 | 位 | 名稱 |
CF | 0 | 進位標誌 |
PF | 2 | 奇偶檢驗標誌 |
AF | 4 | 輔助進位標誌 |
ZF | 6 | 零標誌 |
SF | 7 | 符號標誌 |
OF | 11 | 溢出標誌 |
IA-32平臺的系統標誌:命令行
標誌 | 位 | 名稱 |
TF | 8 | 陷阱標誌 |
IF | 9 | 中斷使能標誌 |
IOPL | 12和13 | I/O特權級別標誌 |
NT | 14 | 嵌套任務標誌 |
RF | 16 | 恢復標誌 |
VM | 17 | 虛擬8086模式標誌 |
AC | 18 | 對準檢查標誌 |
VIF | 19 | 虛擬中斷標誌 |
VIP | 20 | 虛擬中斷掛起標誌 |
ID | 21 | 識別標誌 |
IA-32平臺的FPU寄存器:設計
FPU寄存器 | 描述 |
數據寄存器 | 用於浮點數據的8個80位寄存器 |
狀態寄存器 | 報告FPU狀態的16位寄存器 |
控制寄存器 | 控制FPU精度的16位寄存器 |
標記寄存器 | 描述8個數據寄存器的內容的16位寄存器 |
FIP寄存器 | 指向下一條FPU指令的48位FPU指令指針 |
FDP寄存器 | 指向內存中的數據的48位FPU數據指針 |
操做碼寄存器 | 保存FPU處理的最後指令的11位寄存器 |
binutils包安裝的全部程序見書34頁。指針
as彙編器的命令行參數見書35頁。調試
ld鏈接器的命令行參數見書38頁。內存
gcc編譯器的命令行參數見書40頁。
gdb調試器的命令行參數見書43頁。
objdump的命令行參數見書47頁。
gprof簡檔器的命令行參數見書49頁。
cpuid指令可用的不一樣輸出選項見書57頁。
gdb調試器的經常使用命令見書64頁:
數據命令 | 描述 |
info registers | 顯示全部寄存器的值 |
顯示特定寄存器或者來自程序的變量的值 | |
x | 顯示特定內存位置的內容 |
IA-32平臺的數據聲明僞指令:
命令 | 數據類型 |
.ascii | 文本字符串 |
.asciz | 以空字符結尾的文本字符串 |
.byte | 字節值 |
.double | 雙精度浮點數 |
.float | 單精度浮點數 |
.int | 32位整數 |
.long | 32位整數(和.int相同) |
.octa | 128位整數 |
.quad | 64位整數 |
.short | 16位整數 |
.single | 單精度浮點數(和.float相同) |
定義靜態符號:
.equ factor, 3
.equ LINUX_SYS_CALL, 0x80
bss段定義數據元素命令見書73頁:
命令 | 描述 |
.comm | 聲明未初始化的數據的通用內存區域 |
.lcomm | 聲明未初始化的數據的本地通用內存區域 |
.fill 10000命令使彙編器自動地建立10000個數據元素。
mov指令有很是特殊94的規則,只有某些位置能夠傳送給其餘位置,mov指令的源和目標操做數組合見書76頁。
mov指令的源寄存器寬度和目標寄存器寬度必須相同。
記住在平坦內存模型中,全部內存地址都是使用32位數字表示的。
EFLAGS寄存器的做用:
ELFAGS位 | 名稱 | 描述 |
CF | 進位(Carry)標誌 | 數學表達式產生了進位或者借位 |
OF | 溢出(Overflow)標誌 | 整數值過大或者太小 |
PF | 奇偶校驗(Parity)標誌 | 寄存器包含數學操做形成的錯誤數據 |
SF | 符號(Sign)標誌 | 指出結果爲正仍是負 |
ZF | 零(Zero)標誌 | 數學操做的結果爲零 |
無符號條件傳送指令和有符號條件傳送指令列表見書84頁。
指令 | 描述 |
XCHG | 在兩個寄存器或者寄存器和內存位置之間交換值 |
BSWAP | 反轉一個32位寄存器中的字節順序 |
XADD | 交換兩個值而且把總和存儲在目標操做數中 |
CMPXCHG | 把一個值和一個外部值進行比較,而且交換它和另外一個值 |
CMPXCHG8B | 比較兩個64位值而且交換它們 |
使用xchg對內存位置進行操做時要當心。lock處理是很是耗費時間的,而且可能對程序性能有不良影響。
附加的PUSH和POP指令:
指令 | 描述 |
PUSHA/POPA | 壓入或者彈出全部16位通用寄存器 |
PUSHAD/POPAD | 壓入或者彈出全部32位通用寄存器 |
PUSHF/POPF | 壓入或者彈出EFLAGS寄存器的低16位 |
PUSHFD/POPFD | 壓入或者彈出EFLAGS寄存器的所有32位 |
POPF和POPFD指令的行爲因處理器的操做模式而不一樣。當處理器運行在保護模式下的ring0(特權模式)下時,EFLAGS寄存器中的全部非保留標誌均可以被修改,除VIP、VIF和VM標誌以外。VIP和VIF標誌被清零,VM標誌不會被修改。
當處理器運行在保護模式的更高級別的ring(非特權模式)下時,會獲得和ring0模式下的相同結果,而且不容許修改IOFL字段。
PUSH和POP不是把數據壓入和彈出堆棧的惟一途徑。也能夠經過使用ESP寄存器做爲內存指針,手工地把數據存放到堆棧中。
一般,會看到不少程序把ESP寄存器的值複製到EBP寄存器,而不是使用ESP寄存器自己。在彙編語言函數中常常使用EBP指針指向函數的工做堆棧空間的基址。訪問存儲在堆棧中的參數的指令相對於EBP值引用這些參數。
條件跳轉指令列表見書107頁。
條件跳轉指令不支持分段內存模式下的遠跳轉。若是在分段內存模式下進行程序設計,就必須使用程序設計邏輯肯定條件是否存在,而後實現無條件跳轉轉移到另外一個段中的指令。
專門修改進位標誌的指令(見書112頁):
指令 | 描述 |
CLC | 清空進位標誌(設置它爲零) |
CMC | 對進位標誌求反(把它改變爲相反的值) |
STC | 設置進位標誌(設置它爲1) |
循環指令(見書112頁):
指令 | 描述 |
LOOP | 循環直到ECX寄存器爲零 |
LOOPE/LOOPZ | 循環直到ECX寄存器爲零,或者沒有設置ZF標誌 |
LOOPNE/LOOPNZ | 循環直到ECX寄存器爲零,或者設置了ZF標誌 |
MMX寄存器被映射到FPU寄存器,因此使用MMX寄存器時要當心。記住,在使用任何MMX寄存器指令以前,都要把FPU寄存器中存儲的全部數據保存到內存中。