匯編語言:x86匯編指令大全及其注意事項(xiàng)
Part 1:instruction
積少成多,持續(xù)更新。(這將會是一個極其漫長的過程)
表格中各條指令的順序根據(jù)筆者所認(rèn)為的重要或常用程度進(jìn)行排序,僅供參考。
Part 2
本表格中所涉及的F是指狀態(tài)寄存器,CF指進(jìn)位標(biāo)志位,其它以此類推。
2.1 (邏輯)運(yùn)算、移位等常用指令
這一部分記錄匯編語言程序設(shè)計當(dāng)中使用頻率最高的一部分指令。
2.1 (邏輯)運(yùn)算、移位等常用指令
這一部分記錄匯編語言程序設(shè)計當(dāng)中使用頻率最高的一部分指令。
指令 | 作用 | 注意事項(xiàng) | 示例 |
---|---|---|---|
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 | 帶進(jìn)位加法指令 | 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 | 帶進(jìn)位減法 | 常用于多字節(jié)減法 | |
dec dest | 減一指令 | 不影響CF的狀態(tài),但其他幾個標(biāo)志位都會受到影響 | dec ax |
mul dest | 無符號乘法指 | 1.dest為字節(jié)數(shù)據(jù),則與AL相乘,結(jié)果放入AX 2.dest為字?jǐn)?shù)據(jù),與AX相乘結(jié)果低16位放入AX,高16位放入DX 3.dest不能是立即數(shù) |
mul ax |
imul dest | 有符號乘法 | 細(xì)節(jié)與mul完全相同,對最高位的解釋不同 | imul ax |
div dest | 無符號除法 | 1.dest為字節(jié)數(shù)據(jù),用AX除以dest,商放在AL,余數(shù)放在AH 2.dest為字?jǐn)?shù)據(jù),用低16位為AX,高16位為DX的雙字?jǐn)?shù)據(jù)除以dest,商放在AX,余數(shù)放在DX |
|
idiv dest | 帶符號除法 | 與無符號完全相同。除法溢出時結(jié)果無效 | idiv ax |
cbw | 擴(kuò)展AL為AX字?jǐn)?shù)據(jù) | 1.僅用于擴(kuò)展帶符號數(shù),無符號直接清零即可 2.不帶操作數(shù) |
cbw |
cwd | 擴(kuò)展AX字為DX,AX雙字?jǐn)?shù)據(jù) | 要求與cbw相同 | cwd |
seg | 取標(biāo)號或變量的段地址 | 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默認(rèn)程序從cs:0開始存放指令代碼 3.兩個org指令之間空余的空間用0填充 |
org offsetVal |
xlat | 轉(zhuǎn)換表指令 | 1.BX存放表的首地址,AL存放當(dāng)前表中元素的偏移量 2.不影響F的狀態(tài) |
xlat ;無需操作數(shù) |
2.2 循環(huán)移位指令
循環(huán)移位指令非常容易混淆,但是卻十分重要,因此需要牢牢記住并時常查閱此表。
指令 | 作用 | 注意事項(xiàng) | 示例 |
---|---|---|---|
SHL | 邏輯左移指令 | 1.最高位進(jìn)入CF中 2.最低位直接用0填充 |
SHL AH,1 |
SHR | 邏輯右移指令 | 1.最低位進(jìn)入CF中 2.最高位直接用0填充 |
SHR BX,1 |
SAL | 算術(shù)左移指令 | 行為與SHL沒有差別 | SAL BL,CL |
SAR | 算術(shù)右移指令 | 1.最低位進(jìn)入到CF中 2.最高位右移后填充最高位(即用最高位填充最高位) |
SAR CL,BX |
ROL | 循環(huán)左移指令 | 最高位進(jìn)入到CF中并填充最低位 | 同上 |
ROR | 循環(huán)右移指令 | 最低位進(jìn)入到CF中并填充最高位 | 同上 |
RCL | 帶進(jìn)位循環(huán)左移指令 | 1.最低位由CF填充 2.最高位進(jìn)入CF |
同上 |
RCR | 帶進(jìn)位循環(huán)右移指令 | 1.最高位由CF填充 2.最低位進(jìn)入CF |
同上 |
2.3 數(shù)據(jù)串操作指令
重復(fù)前綴指令與數(shù)據(jù)串操作指令連用常常能起到事半功倍的效果,注意使用了大大提升匯編程序的簡潔性。
指令 | 作用 | 注意事項(xiàng) | 示例 |
---|---|---|---|
lods/lodsw/lodsb | 載入數(shù)據(jù)串指令 | 1.具體操作:從ds:si讀取一個字節(jié)/字/雙字到AL,AX,EAX中,SI根據(jù)DF的值進(jìn)行增減對應(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ù)串傳送指令 | 注意事項(xiàng)參照上方的cmps等的用法 | ;NULL |
rep/repz/repnz | 重復(fù)前綴指令 | 1.當(dāng)cx的內(nèi)容不為0時執(zhí)行操作(先判斷) 2.用CLD,STD控制增、減量修改 3.與數(shù)據(jù)串操作指令結(jié)合使用,實(shí)現(xiàn)內(nèi)存拷貝、比較等功能 |
不需要操作數(shù) |
2.4 邏輯運(yùn)算指令
這一部分指令是以我的理解進(jìn)行劃分,所以可能不太精準(zhǔn),有意見歡迎在評論區(qū)提出。
指令 | 作用 | 注意事項(xiàng) | 示例 |
---|---|---|---|
cmp dest,src | 1.比較指令 | 1.用dest減去src,但不保存結(jié)果 2.相減的結(jié)果影響F |
cmp ax,cx |
test dest,src | 1.將dest與src相與 | 可用來測試是否為零等,結(jié)果不保存 2.影響F |
test ax,ax |
neg dest | 取補(bǔ)指令,得到相反數(shù) | 影響F | neg ax |
not dest | 取反指令 | 1.將操作數(shù)每一位按位取反 2.不影響F |
not AX |
2.5 基于大小關(guān)系的跳轉(zhuǎn)指令
在使用了cmp,sub,subb等指令后通常使用如下這些指令銜接以便進(jìn)行下一步的操作,令程序十分簡潔。需要注意的是,根據(jù)有符號和無符號數(shù)需要選擇不同的指令進(jìn)行基于大小關(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 基于單標(biāo)志位的轉(zhuǎn)移指令
根據(jù)標(biāo)志寄存器F中標(biāo)志位的狀態(tài)決定是否進(jìn)行跳轉(zhuǎn),通常在進(jìn)行運(yùn)算后結(jié)合這些指令進(jìn)行跳轉(zhuǎn)。
指令 | 作用 |
---|---|
JC label | CF=1時跳轉(zhuǎn) |
JNC label | CF=0時跳轉(zhuǎn) |
JZ label | ZF=1時跳轉(zhuǎn) |
JNZ label | ZF=0時跳轉(zhuǎn) |
JO label | OF=1時跳轉(zhuǎn) |
JNO label | OF=0時跳轉(zhuǎn) |
JS label | SF=1時跳轉(zhuǎn) |
JNS label | SF=0時跳轉(zhuǎn) |
JP label | SF=1時跳轉(zhuǎn) |
JNP label | PF=0時跳轉(zhuǎn) |
Part 3:Loading… …
第一次更新:2020-05-15 15:29
第二次更新:2020-05-22 00:14
第三次更新:2020-05-24 00:24
第四次更新:2020-05-24 21:10
持續(xù)更新中… …
到此這篇關(guān)于匯編語言:x86匯編指令大全及其注意事項(xiàng)的文章就介紹到這了,更多相關(guān)x86匯編指令大全內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
匯編語言指令集之條件轉(zhuǎn)移指令實(shí)現(xiàn)
這篇文章主要介紹了匯編語言指令集之條件轉(zhuǎn)移指令實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-01-01