匯編語言: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!