彙編語言程序設計讀書筆記(GAS版)

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 顯示全部寄存器的值
print 顯示特定寄存器或者來自程序的變量的值
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寄存器中存儲的全部數據保存到內存中。

相關文章
相關標籤/搜索