溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

匯編語言中x86匯編指令有哪些

發(fā)布時間:2021-10-08 09:30:34 來源:億速云 閱讀:96 作者:小新 欄目:開發(fā)技術(shù)

這篇文章將為大家詳細講解有關(guān)匯編語言中x86匯編指令有哪些,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

Part 1:instruction

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

Part 2

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

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

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

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

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

指令作用注意事項示例
mov dest, src傳送指令1.dest和src不能同時為存儲器操作數(shù)
2.CS不能作為dest
3.段寄存器之間不能互相傳送
4.立即數(shù)不能送入段寄存器
mov ax,word ptr[bx+si+2]
add dest,src加法指令dest,src不能同時為存儲器操作數(shù)或段寄存器
add ax,cx
adc dest,src帶進位加法指令dest=dest+src+CF,常用于多字節(jié)加法
inc dest加一指令1.此操作不影響CF的狀態(tài)inc byte ptr[si]
sub dest,src減法指令1.dest,src的要求與add相同
2.觸發(fā)OF:異號相減且結(jié)果的符號為與被減數(shù)不同
sub ax,cx
sbb dest,src帶進位減法常用于多字節(jié)減法
dec dest減一指令不影響CF的狀態(tài),但其他幾個標志位都會受到影響dec ax
mul dest無符號乘法指1.dest為字節(jié)數(shù)據(jù),則與AL相乘,結(jié)果放入AX
2.dest為字數(shù)據(jù),與AX相乘結(jié)果低16位放入AX,高16位放入DX
3.dest不能是立即數(shù)
mul ax
imul dest有符號乘法細節(jié)與mul完全相同,對最高位的解釋不同imul ax
div dest無符號除法1.dest為字節(jié)數(shù)據(jù),用AX除以dest,商放在AL,余數(shù)放在AH
2.dest為字數(shù)據(jù),用低16位為AX,高16位為DX的雙字數(shù)據(jù)除以dest,商放在AX,余數(shù)放在DX

idiv dest帶符號除法與無符號完全相同。除法溢出時結(jié)果無效idiv ax
cbw擴展AL為AX字數(shù)據(jù)1.僅用于擴展帶符號數(shù),無符號直接清零即可
2.不帶操作數(shù)
cbw
cwd擴展AX字為DX,AX雙字數(shù)據(jù)要求與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設(shè)定程序段起始地址(偏移)1.是origin的縮寫
2.若無org默認程序從cs:0開始存放指令代碼
3.兩個org指令之間空余的空間用0填充
org offsetVal
xlat轉(zhuǎn)換表指令1.BX存放表的首地址,AL存放當前表中元素的偏移量
2.不影響F的狀態(tài)
xlat ;無需操作數(shù)

2.2 循環(huán)移位指令

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

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

2.3 數(shù)據(jù)串操作指令

重復(fù)前綴指令與數(shù)據(jù)串操作指令連用常常能起到事半功倍的效果,注意使用了大大提升匯編程序的簡潔性。

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

2.4 邏輯運算指令

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

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

2.5 基于大小關(guān)系的跳轉(zhuǎn)指令

在使用了cmp,sub,subb等指令后通常使用如下這些指令銜接以便進行下一步的操作,令程序十分簡潔。需要注意的是,根據(jù)有符號和無符號數(shù)需要選擇不同的指令進行基于大小關(guān)系的跳轉(zhuǎn)。

無符號數(shù)
指令作用
JA label大于時跳轉(zhuǎn)
JAE label大于等于時跳轉(zhuǎn)
JB label小于時跳轉(zhuǎn)
JBE label小于等于時跳轉(zhuǎn)
帶符號數(shù)
指令作用
JG label大于時跳轉(zhuǎn)
JGE label大于等于時跳轉(zhuǎn)
JL label小于時跳轉(zhuǎn)
JEL label小于等于時跳轉(zhuǎn)
無符號、帶符號通用
JE label等于時跳轉(zhuǎn)
JNE label不等于時跳轉(zhuǎn)

2.6 基于單標志位的轉(zhuǎn)移指令

根據(jù)標志寄存器F中標志位的狀態(tài)決定是否進行跳轉(zhuǎn),通常在進行運算后結(jié)合這些指令進行跳轉(zhuǎn)。

指令作用
JC labelCF=1時跳轉(zhuǎn)
JNC labelCF=0時跳轉(zhuǎn)
JZ labelZF=1時跳轉(zhuǎn)
JNZ labelZF=0時跳轉(zhuǎn)
JO labelOF=1時跳轉(zhuǎn)
JNO labelOF=0時跳轉(zhuǎn)
JS labelSF=1時跳轉(zhuǎn)
JNS labelSF=0時跳轉(zhuǎn)
JP labelSF=1時跳轉(zhuǎn)
JNP labelPF=0時跳轉(zhuǎn)

關(guān)于“匯編語言中x86匯編指令有哪些”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI