一、數(shù)據(jù)傳送指令 指令名稱 | 匯編語句格式 | 功能 | 影響標(biāo)志位 | 傳送 move data | mov opd, ops | (ops) → opd;分為主存儲(chǔ)器、通用寄存器、段寄存器,不可同時(shí)使用主存儲(chǔ)器,類型要匹配:byte,word,dword | 無 | 帶符號(hào)擴(kuò)充的傳送 move with sign-extend | movsx opd, ops | 將ops的符號(hào)向前擴(kuò)展成與opd相同的數(shù)據(jù)類型后 → opd ops不能為立即數(shù), | 無 | 帶0擴(kuò)展的傳送 move with zero-extend | movzx opd, ops | 將ops的高位向前補(bǔ)0擴(kuò)展成與opd相同的數(shù)據(jù)類型后 → opd | 無 | 數(shù)據(jù)交換 exchange | xchg opd, ops | 將(opd)與(ops)交換 源操作數(shù)不能是立即操作數(shù) | 無 | 32位寄存器字節(jié)交換 byte swap | bswap reg (reg,代表寄存器,下同) | 將從第一個(gè)與第四個(gè)字節(jié)交換,將第二個(gè)字節(jié)和第三個(gè)字節(jié)交換 (按字節(jié)反序),32位寄存器 | 無 | 交換并相加 exchange and add | xadd opd, ops | 將(opd)與(ops)互換,(opd)+(ops) → opd | af,of,pf, sf,zf,cf | 查表轉(zhuǎn)換 table look-up translation | xlat ops 或 xlatb | (ds:[bx/ebx+al]) → al (求和之前al作無符號(hào)擴(kuò)展), 一般把數(shù)表的首地址放到bx/ebx中,lea bx, buf ;al就是在buf中的位置 | 無 | 傳送偏移地址 load effective address | lea reg,ops | ops → reg | 無 | 傳送偏移地址和數(shù)據(jù)段首地址 load data segment register | lds reg, ops | (ops)→ reg (ops+2/4)→ ds;ops一定是存儲(chǔ)器地址,類型為dword/fword | 無 | 傳送偏移地址和附加段首地址 load far pointer to extra segment | les/lfs/lgs reg, ops | 同上,只是段寄存器分別為es,fs,gs | 無 | 傳送偏移地址和堆棧首地址 load stack segment | lss reg, ops | 同上,段寄存器為ss | 無 | 進(jìn)棧 push word/dword onto stack | push ops pushw ops 或pushd ops | 16位段:(sp) – 2/4 → sp (ops) → [sp]; 可以為兩個(gè)字節(jié), 或四個(gè)字節(jié)32位段:(esp) – 2/4 → esp (ops) → [esp]; 同上 | 無 | 所有16位通用寄存器進(jìn)棧 pushall 16-bit general registers | pusha | (sp/esp) –2 → sp/esp 重復(fù)8次壓入ax,cx,dx,bx,sp(指令執(zhí)前),bp,si,di;是先改變sp/esp 再把數(shù)據(jù)寫入 | 無 | 所有32位通用寄存器進(jìn)棧 pushall 32-bit general registers | pushad | (sp/esp) – 4 → sp/esp 重復(fù)8次壓入eax,ecx,edx,ebx, esp(指令執(zhí)行前),ebp,esi,edi;是先改變sp/esp 再把數(shù)據(jù)寫入 | 無 | 出棧 pop a word/dword frome the stack | pop opd | 16位段:[sp]→ (opd) ; (sp) + 2/4 → sp ;可以為兩個(gè)字節(jié),或四個(gè)字節(jié) 32位段:[esp]→ (opd) ; (esp) + 2/4 → esp ; 同上 | 無 | 出棧到所有16位通用寄存器 pop stack into all 16-bit registers | popa | 將棧頂?shù)?6個(gè)字節(jié)依次出棧到di,si,bp,丟棄2個(gè)字節(jié),bx,dx,cx,ax, (sp/esp)+16 → sp/esp | 無 | 出棧到所有32位通用寄存器 pop stack into all 32-bit registers | popad | 將棧頂?shù)?6個(gè)字節(jié)依次出棧到edi,esi,ebp,丟棄4個(gè)字節(jié),ebx,edx,ecx,eax, (sp/esp)+32 → sp/esp | 無 | 標(biāo)志進(jìn)棧 push flags onto stack | pushf | (sp/esp) – 2 → sp/esp (flags) → [sp/esp] | 無 | 擴(kuò)展標(biāo)志出棧 push eflags onto stack | pushfd | sp/esp – 4 → sp/esp (eflags) → [sp/esp] | 無 | 標(biāo)志出棧 pop stack into flags | popf | [sp/esp] → flags sp/esp + 4 → sp/esp | 無 | 擴(kuò)展標(biāo)志出棧 pop stack into eflags | popfd | [sp/esp] → eflags sp/esp + 4 → sp/esp | 無 | 標(biāo)志傳送到ah load ah from flags | lahf | (flags7-0) → ah | 無 | 將ah傳送到flags store ah into flags | sahf | (ah) → flags7-0 | sf,zf,af,pf,cf | 輸入 input from port | in opd, ops | ([ops]) → opd; opd只能是al、ax、eax;ops為立即數(shù)(<255)或者dx | 無 | 輸出 output to port | out opd, ops | (ops) → [opd]; ops只能是al、ax、eax;opd為立即數(shù)(<255)或者dx | 無 | 二、算術(shù)運(yùn)算指令 指令名稱 | 匯編語句格式 | 功能 | 影響標(biāo)志位 | 加 1 increment | inc opd | (opd) + 1 → opd | af,of,pf, sf,zf | 加 addition | add opd, ops | (opd) + (ops) → opd | af,of,pf, sf,zf | 帶進(jìn)位加 add with carry | adc opd, ops | (opd) + (ops) + cf → opd | af,of,pf, sf,zf | 減 1 decrement | dec opd | (opd) – 1 → opd | af,of,pf, sf,zf | 求補(bǔ) two's complement negation | neg opd | 0 – (opd) → opd | af,of,pf, sf,zf | 減 subtract | sub opd, ops | (opd) – (ops) → opd | af,of,pf, sf,zf | 帶借位減 subtract with borrow | sbb opd, ops | (opd) – (ops) – cf → opd | af,of,pf, sf,zf | 比較 compare | cmp opd, ops | (opd) – (ops) 一般用于轉(zhuǎn)移前的控制,應(yīng)用于跳轉(zhuǎn) | af,of,pf, sf,zf | 無符號(hào)乘 unsigned multiply | mul ops | 字節(jié)乘:(al) * (ops) → ax; 字乘法:(ax) * (ops) → dx:ax; 雙字乘:(eax) * (ops) → edx:eax | cf,of | 單操作數(shù)的有符號(hào)乘 signed integer multiply | imul ops | 字節(jié)乘:(al) * (ops) → ax; 字乘法:(ax) * (ops) → dx:ax; 雙字乘:(eax) * (ops) → edx:eax | cf,of | 雙操作數(shù)的有符號(hào)乘 signed integer multiply | imul opd, ops | (opd) * (ops) → opd;opd可為16/32的寄存器,ops可為同類型的寄存器、存儲(chǔ)器或立即數(shù) | cf,of | 三操作數(shù)的有符號(hào)乘 signed integer multiply | imul opd, ops, n | (ops) * n → opd;同上,n為立即數(shù) | cf,of | 將字節(jié)轉(zhuǎn)換成字 convert byte to word | cbw | 將al中的符號(hào)擴(kuò)展到ah中,數(shù)據(jù)的補(bǔ)碼數(shù)值沒有變 | 無 | 將字轉(zhuǎn)換成雙字 convert word to double word | cwd | 將ax中的符號(hào)擴(kuò)展到dx的高位中 | 無 | 將字轉(zhuǎn)換成雙字 convert word to double word | cwde | 將ax中的符號(hào)擴(kuò)展到eax的高位中 | 無 | 將雙字轉(zhuǎn)換成4字 convert double word to quadword | cdq | 將eax中的符號(hào)擴(kuò)展到edx中 | 無 | 無符號(hào)除 unsigned divide | div ops | 字節(jié)除:(ax)/(ops)→al(商),ah(余數(shù));字除:(dx:ax)/(ops) → ax(商), dx(余數(shù)) 雙字除: (edx:eax)/(ops) → eax(商),edx(余數(shù)) | af,of,pf, cf,sf,zf | 有符號(hào)除 signed integer divide | idiv ops | 字節(jié)除:(ax)/(ops)→al(商),ah(余數(shù));字除:(dx:ax)/(ops) → ax(商), dx(余數(shù)) 雙字除: (edx:eax)/(ops) → eax(商),edx(余數(shù)) | af,of,pf, cf,sf,zf | 三、控制轉(zhuǎn)移指令 指令名稱 | 匯編語句格式 | 功能 | 影響標(biāo)志位 | 相等/等于0轉(zhuǎn)移 jump if equal/zero | je/jz 標(biāo)號(hào) | zf = 1 轉(zhuǎn)移 | 無 | 不相等/不等于0轉(zhuǎn)移 jump if not equal/zero | jne/jnz 標(biāo)號(hào) | zf = 0 轉(zhuǎn)移 | 無 | 為負(fù)轉(zhuǎn)移 jump if sign | js 標(biāo)號(hào) | sf = 1 轉(zhuǎn)移 | 無 | 為正轉(zhuǎn)移 jump if positive | jns 標(biāo)號(hào) | sf = 0 轉(zhuǎn)移 | 無 | 溢出轉(zhuǎn)移 jump if overflow | jo 標(biāo)號(hào) | of = 1 轉(zhuǎn)移 | 無 | 無溢出轉(zhuǎn)移 jump if not overflow | jno 標(biāo)號(hào) | of = 0 轉(zhuǎn)移 | 無 | 有進(jìn)位轉(zhuǎn)移 jump if carry | jc 標(biāo)號(hào) | cf = 1 轉(zhuǎn)移 | 無 | 無進(jìn)位轉(zhuǎn)移 jump if not carry | jnc 標(biāo)號(hào) | cf = 0 轉(zhuǎn)移 | 無 | 偶檢驗(yàn)/偶性轉(zhuǎn)移 jump if parity/parity even | jp/jpe 標(biāo)號(hào) | pf = 1 轉(zhuǎn)移 | 無 | 奇檢驗(yàn)/奇性轉(zhuǎn)移 jump if no parity/parity odd | jnp/jpo 標(biāo)號(hào) | pf = 0 轉(zhuǎn)移 | 無 | 小于/不大于也不等于 轉(zhuǎn)移 jump if less/not greater nor equal | jl/jnge 標(biāo)號(hào) | sf ≠ of 轉(zhuǎn)移 | 無 | 不小于/大于或等于轉(zhuǎn)移 jump if not less/greater or equal | jnl/jge 標(biāo)號(hào) | sf = of 轉(zhuǎn)移 | 無 | 大于/不小于或不等于轉(zhuǎn)移 jump if greater/not less or not equal | jg/jnle 標(biāo)號(hào) | sf = of, 且zf = 0 轉(zhuǎn)移 | 無 | 不大于/小于或等于轉(zhuǎn)移 jump if not greater /less or equal | jng/jle 標(biāo)號(hào) | sf ≠ of 或zf = 1 轉(zhuǎn)移 | 無 | 低于/不高于且不等于轉(zhuǎn)移(無符號(hào)) jump if below/not above not equal | jb/jnae 標(biāo)號(hào) | cf = 1 轉(zhuǎn)移 | 無 | 不低于/高于或等于轉(zhuǎn)移(無符號(hào)) jump if now below/above or equal | jnb/jae 標(biāo)號(hào) | cf = 0 轉(zhuǎn)移 | 無 | 高于/不低于且比等于轉(zhuǎn)移(無符號(hào)) jump if above/not below nor equal | ja/jnbe 標(biāo)號(hào) | cf = 0 且 zf = 0 轉(zhuǎn)移 | 無 | 不高于/低于或等于 jump if not above/below or equal | jna/jbe 標(biāo)號(hào) | cf = 1 或 zf =1 轉(zhuǎn)移 | 無 | 無條件轉(zhuǎn)移 jump unconditionally | jmp opd | 相對(duì)轉(zhuǎn)移:(opd)+ip/eip → ip/eip 近轉(zhuǎn)移:(opd) → ip/eip 遠(yuǎn)轉(zhuǎn)移:(opd) → ip/eip, (opd+2/4) → cs,或根據(jù)描述符決定 | 無 | cx為0轉(zhuǎn)移 jump if cx is zero | jcxz 標(biāo)號(hào) 或jecxz 標(biāo)號(hào) | 若(cx/ecx) = 0 轉(zhuǎn)移 | 無 | 循環(huán) loop | loop 標(biāo)號(hào) 或loopw/loopd 標(biāo)號(hào) | (cx/ecx) – 1 → cx/ecx, 若(cx/ecx) ≠ 0 則轉(zhuǎn)移 | 無 | 相等/為0循環(huán) loop if equal/zero | loope/loopz 標(biāo)號(hào) | (cx/ecx) – 1 → cx/ecx,若(cx/ecx) ≠ 0 且zf = 1 則轉(zhuǎn)移 | 無 | 不相等/不為0循環(huán) loop if not equal/not zero | loopne/loopnz 標(biāo)號(hào) | (cx/ecx) – 1 → cx/ecx,若(cx/ecx) ≠ 0 且zf = 0 則轉(zhuǎn)移 | 無 | 檢查數(shù)組下標(biāo)邊界 check array index against bounds | bound reg, ops | 若reg的索引值小于ops指定的下邊界或大于ops指定的上邊界,則變成5號(hào)異常 | 無 | 調(diào)用子程序 call a procedure | call opd | 調(diào)用opd所指定的子程序(32位段的遠(yuǎn)調(diào)用時(shí),CS被擴(kuò)展成4字節(jié)后壓棧) | 任務(wù)切換有影響,否則無 | 從子程序返回 return from procedure | ret [n] n代表16位常量,[]表可選 | 從子程序返回到調(diào)用語句的下一個(gè)語句處,若n存在,則(sp/esp)+n → sp/esp;32位段遠(yuǎn)返回時(shí),cs出棧時(shí)改變4字節(jié)的棧指針 | 無 | 中斷調(diào)用 interrupt | int n | (flags/eflags) 入棧,0→if,tf;(cs) 入棧;(4*n)→ip,(4*n+2)→cs或根據(jù)idt給eip,cs賦值 | 0→tf,if,返回時(shí)復(fù)原 | 溢出中斷 interrupt if overflow | into | (flags/eflags) 入棧,0→if,tf;(cs) 入棧;(4*n)→ip,(4*n+2)→cs或根據(jù)idt給eip,cs賦值;of=1時(shí)產(chǎn)生int 4 | 0→tf,if,返回時(shí)復(fù)原 | 中斷返回 interrupt return | iret 或iretd(32位段) 或iretf | ip出棧,cs出棧,flags/eflags出棧,根據(jù)nt標(biāo)志做相應(yīng)的處理 | 都有影響 | 四、串操作指令 指令名稱 | 匯編語句格式 | 功能 | 影響標(biāo)志位 | 串傳送 move byte/word string | movs opd, ops movsb,movsw,movsd | (ds:[si/esi]) → es:[di/edi],(ops所在的段可以取代ds),(si/esi)±1/2/4 → si/esi, (di/edi)±1/2/4 → di/edi | 無 | 串比較 compare string | cmps ops, opd cmpsb,compsw,compsd | (ds:[si/esi]) – (es:[di/edi]),(si/esi)±1/2/4 → si/esi, (di/edi)±1/2/4 →di/edi | af,cf,of,pf, sf,zf | 串搜索 scan string | scas opd scasb,scasw,scasd | (al/ax/eax) – (es:[di/edi]),(di/edi)±1/2/4 →di/edi | af,cf,of,pf, sf,zf | 取字符串 load string | lods ops lodsb, lodsw,lodsd | (ds:[si/esi]) → al/ax/eax,(ops所在的段可以取代ds), (si/esi)±1/2/4 →si/esi | 無 | 存字符串 store string | stos opd stosb,stosw,stosd | (al/ax/eax)→es:[di/edi],(di/edi)±1/2/4 →di/edi | 無 | 輸入串 input from port to string | ins opd, dx insb,insw,insd | ([dx]) →es:[di/edi],(di/edi)±1/2/4 →di/edi | 無 | 輸出串 output string port | outs opd, ops outsb,outsw,outsd | (ds:[si/esi])→[dx],(si/esi)±1/2/4 →si/esi | 無 | 重復(fù)前綴 repeat string operation | rep 串操作指令 | repe/repz 串操作指令 | repne/repnz 串操作指令 | | 若(cx/ecx) ≠ 0,執(zhí)行一個(gè)串操作,(cx/ecx)-1→cx/ecx,返回再做 | 若(cx/ecx) ≠ 0且zf=1,執(zhí)行一次串操作,(cx/ecx)-1→cx/ecx,返回 | 若(cx/ecx) ≠ 0且zf=0,執(zhí)行一次串操作,(cx/ecx)-1→cx/ecx,返回 | | 無 | 五、位操作指令 指令名稱 | 匯編語句格式 | 功能 | 影響標(biāo)志位 | 求反 one's complement negation | not opd | ▁▁▁▁▁ (opd)→opd | 無 | 邏輯乘 and | and opd, ops | (opd)∧(ops)→opd | pf,sf | 位測試 bit test | bt opd, ops | 將(ops)作為位偏移(0~31)指明的opd對(duì)應(yīng)位的值→CF | cf | 位測試并求補(bǔ) bit test and complement | btc opd, ops | 在bt指令的基礎(chǔ)上,將opd的對(duì)應(yīng)位求反后→opd | cf | 位測試并清0 bit test and reset | btr opd, ops | 在bt指令的基礎(chǔ)上,將0→opd的對(duì)應(yīng)位 | cf | 位測試并置1 bit test and set | bts opd, ops | 在bt指令的基礎(chǔ)上,將1→opd的對(duì)應(yīng)位 | cf | 正向位掃描 bit scan forward | bsf reg, ops | 從0位開始掃描ops各位,若均為0,則zf=1,否則將第一個(gè)為1的位置值 →reg,zf=0 | zf | 反向位掃描 bit scan reverse | bsr reg, ops | 從最高位開始掃描ops各位,若均為0,則zf=1,否則,將首先碰到的為1的位置值→reg,zf=0 | zf | 測試 test | test opd, ops | (ops)∧(opd) | sf,zf,pf; 0→of,cf | 邏輯加 inclusive or | or opd, ops | (opd)∨(ops)→opd | sf,zf,pf; 0→of,cf | 按位加 exclusive or | xor opd, ops | 加法,就是用異或的計(jì)算方法了 | sf,zf,pf; 0→of,cf | 算術(shù)左移 shift arithmetic left | sal opd, 1 ;sal opd, cl; sal opd, 8位立即數(shù) | cf中的值是最后移入位的值 | sf,zf,pf,cf
| 邏輯左移 shift logic left | shl opd, 1; shl opd, cl shl opd, 8位立即數(shù) | cf中的值是最后移入位的值 | sf,zf,pf,cf | 雙精度左移 double precision shift left | shld opd, reg,八位立即數(shù) shld opd, reg, cl | 將reg的最高n位移入opd的低n位中,reg保持不變,opd最后移入的一位保存在cf中 | cf,sf,zf,pf | 算術(shù)右移 shift arithmetic rigtht | sar opd,1; sar opd, cl sar opd, 8位立即數(shù) | 將(opd)向右移動(dòng)n個(gè)指定的次數(shù)且最高位保持不變,cf的內(nèi)容為最后移入位的值 | sf,zf,pf,cf 等 | 邏輯右移 shift logical right | shr opd, 1; shr opd cl shr opd, 8位立即數(shù) | 將(opd)向右移動(dòng)n規(guī)定的次數(shù),最高位補(bǔ)入0,cf的內(nèi)容為最后移入位的值 | sf,zf,pf,cf 等 | 雙精度右移 double precision shift right | shrd opd, reg,8位立即數(shù) shrd opd, reg, cl | 將reg的最低n位移入opd高n位中,reg保持不變,opd最后移出的一位保存在cf中 | cf,sf,zf,pf | 循環(huán)右移 rotate rigth | ror opd, 1; ror opd cl ror opd, 8位立即數(shù) | 將目的操作數(shù)的最高位和最低位連接起來,組成一個(gè)環(huán),將環(huán)中的所有位一起向右移動(dòng)n位規(guī)定的數(shù)目(cl或立即數(shù)確定),cf為最后移入位的值 | cf | 循環(huán)左移 rotate left | rol opd,1; rol opd cl rol opd, 8位立即數(shù) | 同上,向左移動(dòng) | cf | 帶進(jìn)位的循環(huán)右移 rotate right through carry | rcr opd, 1; rcr opd, cl rcr opd, 8位立即數(shù) | cf在最低位,與目的操作數(shù)連成環(huán),移動(dòng) | cf | 帶進(jìn)位的循環(huán)左移 rotate left through carry | rcl opd, 1; rcl opd, cl rcl opd, 8位立即數(shù) | cf在最高位,與目的操作數(shù)連成環(huán),移動(dòng)指定的位數(shù) | cf | 六、尋址方式 尋址方式 | 格式 | 功能 | 實(shí)例 | 寄存器尋址 | R | 寄存器R的內(nèi)容就是操作數(shù)(R是任意寄存器個(gè)別指令的限制除外) R可以是ax,bx,cx,dx,cs,ds,ss,es……. | inc bx | 寄存器間接尋址 | [R] SS:[R]; 堆棧段 DS:[R]; 數(shù)據(jù)段 | 操作數(shù)在主存儲(chǔ)器中,而操作數(shù)的偏移地址EA在指明的寄存器中 16位:只能是bx,bp,si,di 32位:通用寄存器(eax,ebx,ecx,edx,edi,esi,ebp,esp) 未指明段時(shí),bp,ebp,esp為堆棧段,其余是數(shù)據(jù)段 | mov a, [si] mov cx, [ebp] | 變址尋址 | 16位:[R+V],[R]+V,V[R] 32位:[R*F+V], [R*F]+V,V[R*F] | 操作數(shù)在主存儲(chǔ)器中,偏移地址EA在指定寄存器R的內(nèi)容乘以比例因子F與給出位移量V的和。 位移量V是不超過16位或不超過32位的二進(jìn)制補(bǔ)碼表示的有符號(hào)數(shù)(立即數(shù)),也可以是符合語法規(guī)則的數(shù)值表達(dá)式,變量,標(biāo)號(hào), 最后計(jì)算的偏移量是無符號(hào)數(shù), 未明確段時(shí),規(guī)則如上 | mov al, [ebx*2]+5 add –2[bp], ax mov 2*10h[si]
| 基址加變址尋址 | 16位:[bx/bp+si/di+V] V[bx/bp][si/di] V[bx/bp+si/di] 32位:[BR+IR*F+V], V[BR][IR*F], V[BR+IR*F] | 操作數(shù)在主存儲(chǔ)器中,偏移地址EA是指令中基址寄存器的內(nèi)容、變址寄存器的內(nèi)容乘以比例因子、位移量V三項(xiàng)之和 32位時(shí)IR不能是esp, br中的來確定段 | mov ax, 8[bx][si] mov eax, –6[edi*2][ebp]
| 立即尋址 | n | 所提供額操作數(shù)是緊跟在指令碼后面的一個(gè)采用8位、16位或32位二進(jìn)制補(bǔ)碼表示的有符號(hào)書,構(gòu)成指令的一部分 n是立即數(shù),可以是占用1個(gè)字節(jié),2個(gè)字節(jié),4個(gè)字節(jié)的存儲(chǔ)單元,具體的類型必須要表示出來,根據(jù)指令的其它部分來決定,n只能是常數(shù)或結(jié)果為確定值的表達(dá)式,且只能做源操作數(shù) | mov word ptr [si],12h add eax, -12345678h | 直接尋址 | 段寄存器名:[n] 變量 變量+常量 | 操作數(shù)在主存儲(chǔ)器中, n是一個(gè)數(shù)值或數(shù)值表達(dá)式時(shí),直接表明操作數(shù)的偏移地址值,且為無符號(hào)數(shù),[n]不能指明段寄存器,所以加了一個(gè)段說明符, 變量或變量+常量的地址表達(dá)式在匯編過程中被轉(zhuǎn)換成“段寄存器名:[n]”的形式,期中n是匯編程序計(jì)算地址表達(dá)式得到的結(jié)果, | mov ds:[20h], cl inc buf; (buf是定義的變量) mov ax, array1 mov array, bx sub cx, array3 mov dx, array4+3 (array* 是定義的變量) |
|