您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關匯編語言中x86匯編指令有哪些,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
積少成多,持續更新。(這將會是一個極其漫長的過程)
表格中各條指令的順序根據筆者所認為的重要或常用程度進行排序,僅供參考。
本表格中所涉及的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.不帶操作數 | 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 ;無需操作數 |
循環移位指令非常容易混淆,但是卻十分重要,因此需要牢牢記住并時常查閱此表。
指令 | 作用 | 注意事項 | 示例 |
---|---|---|---|
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 | 取補指令,得到相反數 | 影響F | neg ax |
not dest | 取反指令 | 1.將操作數每一位按位取反 2.不影響F | not 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時跳轉 |
關于“匯編語言中x86匯編指令有哪些”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。