組合語言 x86彙編指令大全及其注意事項

2021-10-06 04:24:52 字數 4359 閱讀 5451

part 3:loading... ...

積少成多,持續更新。(這將會是乙個極其漫長的過程)

**中各條指令的順序根據筆者所認為的重要或常用程度進行排序,僅供參考。

本**中所涉及的f是指狀態暫存器,cf指進製標誌位,其它以此類推。

這一部分記錄組合語言程式設計當中使用頻率最高的一部分指令。

指令作用

注意事項

示例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.不帶運算元

cbwcwd

擴充套件ax字為dx,ax雙字資料

要求與cbw相同

cwdseg

取標號或變數的段位址

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 ;無需運算元

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

指令作用

注意事項

示例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

同上重複字首指令與資料串操作指令連用常常能起到事半功倍的效果,注意使用了大大提公升匯程式設計序的簡潔性。

指令作用

注意事項

示例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.與資料串操作指令結合使用,實現記憶體拷貝、比較等功能

不需要運算元

指令作用

注意事項

示例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

取補指令,得到相反數

影響fneg ax

not dest

取反指令

1.將運算元每一位按位取反

2.不影響fnot ax

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

無符號數

指令作用

ja label

大於時跳轉

jae label

大於等於時跳轉

jb label

小於時跳轉

jbe label

小於等於時跳轉

帶符號數

指令作用

jg label

大於時跳轉

jge label

大於等於時跳轉

jl label

小於時跳轉

jel label

小於等於時跳轉

無符號、帶符號通用

je label

等於時跳轉

jne label

不等於時跳轉

根據標誌暫存器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時跳轉

第一次更新:2020-05-15 15:29

第二次更新:2020-05-22 00:14

第三次更新:2020-05-24 00:24

第四次更新:2020-05-24 21:10

持續更新中… …

x86組合語言指令集

一 資料傳輸指令 8088 彙編跳轉 cmp a,b 比較a與b mov a,b 把b的值送給a ret 返回主程式 nop 無作用,英文 no operation 的簡寫,意思是 do nothing call 呼叫子程式 je 或jz 若相等則跳 jne或jnz 若不相等則跳 jmp 無條件跳 ...

X86彙編指令詳解

x86彙編基本分為七大體系 分別是 1 資料傳送指令 2 算術運算指令 3 邏輯運算指令 4 串操作指令 5 控制轉移指令 6 處理器控制指令 7 保護方式指令 先介紹資料傳送指令集 1 資料傳送指令 1.mov 格式 mov destination,source 功能 將s ource中的資料傳送...

組合語言 基於X86 學習筆記

1.機器語言 machine language 是一種數字語言,專門設計成唄計算機處理器 cpu 理解。所有x86處理器都理解的共同機器語言。2.組合語言 assembly language 包含助記符書寫的語言。3.組合語言與機器語言是一一對應 one to one 的關係。4.彙編器 assem...