匯編語言:x86匯編指令大全及其註意事項

Part 1:instruction

積少成多,持續更新。(這將會是一個極其漫長的過程)
表格中各條指令的順序根據筆者所認為的重要或常用程度進行排序,僅供參考。

Part 2

本表格中所涉及的F是指狀態寄存器,CF指進位標志位,其它以此類推。

2.1 (邏輯)運算、移位等常用指令

這一部分記錄匯編語言程序設計當中使用頻率最高的一部分指令。

2.1 (邏輯)運算、移位等常用指令

這一部分記錄匯編語言程序設計當中使用頻率最高的一部分指令。

指令 作用 註意事項 示例
mov dest, src 傳送指令 1.dest和src不能同時為存儲器操作數
2.CS不能作為dest
3.段寄存器之間不能互相傳送
4.立即數不能送入段寄存器
mov ax,word ptr[bx+si+2]
add dest,src 加法指令 dest,src不能同時為存儲器操作數或段寄存器 add ax,cx
adc dest,src 帶進位加法指令 dest=dest+src+CF,常用於多字節加法
inc dest 加一指令 1.此操作不影響CF的狀態 inc byte ptr[si]
sub dest,src 減法指令 1.dest,src的要求與add相同
2.觸發OF:異號相減且結果的符號為與被減數不同
sub ax,cx
sbb dest,src 帶進位減法 常用於多字節減法
dec dest 減一指令 不影響CF的狀態,但其他幾個標志位都會受到影響 dec ax
mul dest 無符號乘法指 1.dest為字節數據,則與AL相乘,結果放入AX
2.dest為字數據,與AX相乘結果低16位放入AX,高16位放入DX
3.dest不能是立即數
mul ax
imul dest 有符號乘法 細節與mul完全相同,對最高位的解釋不同 imul ax
div dest 無符號除法 1.dest為字節數據,用AX除以dest,商放在AL,餘數放在AH
2.dest為字數據,用低16位為AX,高16位為DX的雙字數據除以dest,商放在AX,餘數放在DX
idiv dest 帶符號除法 與無符號完全相同。除法溢出時結果無效 idiv ax
cbw 擴展AL為AX字數據 1.僅用於擴展帶符號數,無符號直接清零即可
2.不帶操作數
cbw
cwd 擴展AX字為DX,AX雙字數據 要求與cbw相同 cwd
seg 取標號或變量的段地址 mov di,seg label
lea 取偏移地址 1.與offset作用類似
2.load efficient address的簡寫
lea ax,label
offset 取偏移地址 1.作用與lea相同
2.速度比lea快
mov ax,offset label
org 設定程序段起始地址(偏移) 1.是origin的縮寫
2.若無org默認程序從cs:0開始存放指令代碼
3.兩個org指令之間空餘的空間用0填充
org offsetVal
xlat 轉換表指令 1.BX存放表的首地址,AL存放當前表中元素的偏移量
2.不影響F的狀態
xlat ;無需操作數

2.2 循環移位指令

循環移位指令非常容易混淆,但是卻十分重要,因此需要牢牢記住並時常查閱此表。

指令 作用 註意事項 示例
SHL 邏輯左移指令 1.最高位進入CF中
2.最低位直接用0填充
SHL AH,1
SHR 邏輯右移指令 1.最低位進入CF中
2.最高位直接用0填充
SHR BX,1
SAL 算術左移指令 行為與SHL沒有差別 SAL BL,CL
SAR 算術右移指令 1.最低位進入到CF中
2.最高位右移後填充最高位(即用最高位填充最高位)
SAR CL,BX
ROL 循環左移指令 最高位進入到CF中並填充最低位 同上
ROR 循環右移指令 最低位進入到CF中並填充最高位 同上
RCL 帶進位循環左移指令 1.最低位由CF填充
2.最高位進入CF
同上
RCR 帶進位循環右移指令 1.最高位由CF填充
2.最低位進入CF
同上

2.3 數據串操作指令

重復前綴指令與數據串操作指令連用常常能起到事半功倍的效果,註意使用瞭大大提升匯編程序的簡潔性。

指令 作用 註意事項 示例
lods/lodsw/lodsb 載入數據串指令 1.具體操作:從ds:si讀取一個字節/字/雙字到AL,AX,EAX中,SI根據DF的值進行增減對應的數值 lodsw ;無需操作數
stos/stosw/stosb 存數據串指令 1.AX/AL的內容存放到ES:DI中
2.指針修改是自動且隱式的
stos/stosw/stosb ;無需操作數
cmps/cmpsb/cmpsw 數據串比較指令 cmps需要兩個操作數(數據串首地址),後兩個無需操作數,字符串的比較由DI和SI完成 ;NULL
movs/movsb/movsw 數據串傳送指令 註意事項參照上方的cmps等的用法 ;NULL
rep/repz/repnz 重復前綴指令 1.當cx的內容不為0時執行操作(先判斷)
2.用CLD,STD控制增、減量修改
3.與數據串操作指令結合使用,實現內存拷貝、比較等功能
不需要操作數

2.4 邏輯運算指令

這一部分指令是以我的理解進行劃分,所以可能不太精準,有意見歡迎在評論區提出。

指令 作用 註意事項 示例
cmp dest,src 1.比較指令 1.用dest減去src,但不保存結果
2.相減的結果影響F
cmp ax,cx
test dest,src 1.將dest與src相與 可用來測試是否為零等,結果不保存
2.影響F
test ax,ax
neg dest 取補指令,得到相反數 影響F neg ax
not dest 取反指令 1.將操作數每一位按位取反
2.不影響F
not AX

2.5 基於大小關系的跳轉指令

在使用瞭cmp,sub,subb等指令後通常使用如下這些指令銜接以便進行下一步的操作,令程序十分簡潔。需要註意的是,根據有符號和無符號數需要選擇不同的指令進行基於大小關系的跳轉。

無符號數
指令 作用
JA label 大於時跳轉
JAE label 大於等於時跳轉
JB label 小於時跳轉
JBE label 小於等於時跳轉
帶符號數
指令 作用
JG label 大於時跳轉
JGE label 大於等於時跳轉
JL label 小於時跳轉
JEL label 小於等於時跳轉
無符號、帶符號通用
JE label 等於時跳轉
JNE label 不等於時跳轉

2.6 基於單標志位的轉移指令

根據標志寄存器F中標志位的狀態決定是否進行跳轉,通常在進行運算後結合這些指令進行跳轉。

指令 作用
JC label CF=1時跳轉
JNC label CF=0時跳轉
JZ label ZF=1時跳轉
JNZ label ZF=0時跳轉
JO label OF=1時跳轉
JNO label OF=0時跳轉
JS label SF=1時跳轉
JNS label SF=0時跳轉
JP label SF=1時跳轉
JNP label PF=0時跳轉

Part 3:Loading… …

第一次更新:2020-05-15 15:29
第二次更新:2020-05-22 00:14
第三次更新:2020-05-24 00:24
第四次更新:2020-05-24 21:10

持續更新中… …

到此這篇關於匯編語言:x86匯編指令大全及其註意事項的文章就介紹到這瞭,更多相關x86匯編指令大全內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: