javascript
【debug】汇编跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等
匯編跳轉指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等
2017年11月12日 15:01:09?zmmycsdn?閱讀數 19334
轉自:http://www.cnblogs.com/del/archive/2010/04/16/1713886.html
http://pan.baidu.com/s/1gVTSi
跳轉指令分三類:
一、無條件跳轉:
JMP ;無條件跳轉
二、根據CX、ECX寄存器的值跳轉:
三、根據EFLAGS寄存器的PSW標志位跳轉, 這個太多了.
根據標志位跳轉的指令:
?
? JE ;等于則跳轉 同JZ JNE ;不等于則跳轉 同JNZ JA ;無符號大于則跳轉 JNA ;無符號不大于則跳轉 JAE ;無符號大于等于則跳轉 同JNB JNAE ;無符號不大于等于則跳轉 同JB
?
JB ;無符號小于則跳轉 JNB ;無符號不小于則跳轉 JBE ;無符號小于等于則跳轉 同JNA JNBE ;無符號不小于等于則跳轉 同JA ? JG ;有符號大于則跳轉 JNG ;有符號不大于則跳轉 JGE ;有符號大于等于則跳轉 同JNL JNGE ;有符號不大于等于則跳轉 同JL ? JL ;有符號小于則跳轉 JNL ;有符號不小于則跳轉 JLE ;有符號小于等于則跳轉 同JNG JNLE ;有符號不小于等于則跳轉 同JG?
JZ ;為零則跳轉 JNZ ;不為零則跳轉JS ;為負則跳轉 JNS ;不為負則跳轉JC ;進位則跳轉 JNC ;不進位則跳轉JO ;溢出則跳轉 JNO ;不溢出則跳轉 ?JP ;為偶則跳轉
? JNP ;不為偶則跳轉 JPE ;奇偶位置位則跳轉 同JP JPO ;奇偶位復位則跳轉 同JNP?
跳轉相關的PSW標志位:
| 溢 出 | 方 向 | 中 斷 | 陷 阱 | 符 號 | 零 | 未 用 | 輔 助 | 未 用 | 奇 偶 | 未 用 | 進 位 |
影響標志位的匯編指令:
?
加法指令:ADD、ADC、INC、XADD除了INC不影響CF標志位外,都影響條件標志位。CF、ZF、SF、OFCF最高位是否有進位DF若兩個操作數符號相同而結果符號與之相反OF=1,否則OF=0.減法指令:SUB、SBB、DEC、NEG、CMP、CMPXCHG、CMPXCHG8B前六種除了DEC不影響CF標志外都影響標志位。CMPXHG8B只影響ZF。CF說明無符號數相減的溢出,同時又確實是被減數最高有效位向高位的借位。OF位則說明帶符號數的溢出無符號運算時,若減數>被減數,有借位CF=1,否則CF=0.OF若兩個數符號相反,而結果的符號與減數相同則OF=1.否則OF=0.乘法指令:MUL、IMULMUL:如果乘積高一半為0,則CF和OF位均為0,否則CF和OF均為1.IMUL:如果高一半是低一半符號的擴展,則CF位和OF位均為0,否則就均為1.除法指令:DIV、IDIV對所有條件位均無定義。邏輯指令:AND、OR、NOT、XOR、TESTNOT不影響標志位,其余4種CF、OF、置0,AF無定義,SF、ZF、PF位看情況而定。定位掃描指令:BSF正向位掃描、BSR反向位掃描影響ZF位。?
| 指令類型 | 助記符 | 對標志寄存器的影響 | 備注 | ||||||||||
| ZF | CF | PF | SF | OF | AF | DF | IF | TF | ? | ||||
| ? ? ? ? 數據傳送類 | 通用 | MOV | ? ? ? ? ? 不影響標志位 | ? | |||||||||
| 交換 | XCHG | ? | |||||||||||
| 堆棧操作 | PUSH | ? | |||||||||||
| POP | ? | ||||||||||||
| ? 地址傳送 | LEA | ? | |||||||||||
| LDS | ? | ||||||||||||
| LES | ? | ||||||||||||
| ? 累加器專用 | IN | ? | |||||||||||
| OUT | ? | ||||||||||||
| XALT | ? | ||||||||||||
| ? 標志寄存器 | LAHF | ? | |||||||||||
| SAHF | 標志寄存器低八位的內容由AH的值決定 | CF,AF,ZF,SF,PF的值會被影響 | |||||||||||
| PUSHF | 不影響標志位 | ? | |||||||||||
| POPF | 標志寄存器的內容由裝入的具體值決定 | 可能影響所有標志位 | |||||||||||
| ? ? ? ? ? ? ? 算術運算類 | ? ? 加法 | ADD | √ | √ | √ | √ | √ | √ | ? | ? | ? | ? | |
| ADC | √ | √ | √ | √ | √ | √ | ? | ? | ? | ? | |||
| INC | √ | ? | √ | √ | √ | √ | ? | ? | ? | INC指令不影響CF | |||
| AAA | ? | √ | ? | ? | ? | √ | ? | ? | ? | ?表示不確定或者未定義 | |||
| DAA | √ | √ | √ | √ | ? | √ | ? | ? | ? | ? | |||
| ? ? 減法 | SUB | √ | √ | √ | √ | √ | √ | ? | ? | ? | ? | ||
| SBB | √ | √ | √ | √ | √ | √ | ? | ? | ? | ? | |||
| DEC | √ | ? | √ | √ | √ | √ | ? | ? | ? | DEC指令不影響CF | |||
| AAS | ? | √ | ? | ? | ? | √ | ? | ? | ? | ? | |||
| DAS | √ | √ | √ | √ | ? | √ | ? | ? | ? | DAA指令不影響OF | |||
| ? 乘法 | MUL | ? | √ | ? | ? | √ | ? | ? | ? | ? | ? | ||
| IMUL | ? | √ | ? | ? | √ | ? | ? | ? | ? | ? | |||
| AAM | √ | ? | √ | √ | ? | ? | ? | ? | ? | ? | |||
| ? 除法 | DIV | ? | ? | ? | ? | ? | ? | ? | √ | √ | 此指令可能會產生中斷,故影響IF,TF | ||
| IDIV | ? | ? | ? | ? | ? | ? | ? | √ | √ | 同上 | |||
| AAD | √ | ? | √ | √ | ? | ? | ? | ? | ? | ? | |||
| 符號位擴展 | CBW | 不影響標志位 | ? | ||||||||||
| CWD | 不影響標志位 | ? | |||||||||||
| 比較 | CMP | 由計算結果確定標志位的值 | 不會影響到DF,IF,TF | ||||||||||
| ? ? 邏輯運算類 | ? ? 單 操 作 數 | 求反 | NOT | 不影響標志位 | ? | ||||||||
| ? 移位 | SAL | √ | √ | √ | √ | 見 備 注 | ? | ? | ? | ? | ? OF標志位只在移位次數是1時有效 AF未定義 | ||
| SHL | √ | √ | √ | √ | ? | ? | ? | ? | |||||
| SAR | √ | √ | √ | √ | ? | ? | ? | ? | |||||
| SHR | √ | √ | √ | √ | ? | ? | ? | ? | |||||
| ? 循環 移位 | ROL | ? | √ | ? | ? | √ | ? | ? | ? | ? | ? 循環移位指令影響OF和CF AF未定義 | ||
| ROR | ? | √ | ? | ? | √ | ? | ? | ? | ? | ||||
| RCL | ? | √ | ? | ? | √ | ? | ? | ? | ? | ||||
| RCR | ? | √ | ? | ? | √ | ? | ? | ? | ? | ||||
| ? | 雙 操 作 數 | 與 | AND | √ | 置0 | √ | √ | 置0 | ? | ? | ? | ? | ? |
| 或 | OR | √ | 置0 | √ | √ | 置0 | ? | ? | ? | ? | ? | ||
| 異或 | XOR | √ | 置0 | √ | √ | 置0 | ? | ? | ? | ? | ? | ||
| 檢測 | TSET | √ | 置0 | √ | √ | 置0 | ? | ? | ? | ? | ? | ||
| 字符串操作 | 傳送 | MOVS | 不影響標志位 | ? | |||||||||
| 比較 | CMPS | 由計算結果確定標志位的值 | 不會影響DF,IF,TF | ||||||||||
| 搜索 | SCAS | 由計算結果確定標志位的值 | 不會影響DF,IF,TF | ||||||||||
| 裝入 | LODS | 不影響標志位 | ? | ||||||||||
| 填充 | STOS | 不影響標志位 | ? | ||||||||||
| 前綴 | REP | 不影響標志位 | ? | ||||||||||
| ? ? ? ? ? ? ? ? 程序控制類 | 無條件轉移 | JMP | ? ? ? ? ? 不影響標志位 | ? | |||||||||
| ? ? ? 條 件 轉 移 | ? 單個 標志 位 | JS/JNS | SF=1/0,則轉移到目的地址 | ||||||||||
| JZ/ JNZ | ZF=1/0,則轉移到目的地址 | ||||||||||||
| JP/JNP | PF=1/0,則轉移到目的地址 | ||||||||||||
| JB/JNB | CF=1/0,則轉移到目的地址 | ||||||||||||
| JO/JNO | OF=1/0,則轉移到目的地址 | ||||||||||||
| 若干 標志 位的 邏輯 組合 | JA | 兩個無符號數比較,A>B | |||||||||||
| JBE | 兩個無符號數比較,A <=B | ||||||||||||
| JG | 兩個帶符號數比較,A>B | ||||||||||||
| JGE | 兩個帶符號數比較,A>=B | ||||||||||||
| JL | 兩個帶符號數比較,A<B | ||||||||||||
| JLE | 兩個帶符號數比較,A <=B | ||||||||||||
| ? ? 循環控制 | LOOP | ? ? 不影響標志位 | ? | ||||||||||
| LOOPE | ? | ||||||||||||
| LOOPNE | ? | ||||||||||||
| JCXZ | ? | ||||||||||||
| JECXZ | ? | ||||||||||||
| ? 中斷控制 | INT | 不影響標志位 | ? | ||||||||||
| INTO | ? | ||||||||||||
| IRET | 影響所有標志位 | 標志位到恢復中斷以前的狀態 | |||||||||||
| ? ? ? CPU控制指令 | ? ? ? 標志位操作 | CLC | ? | √ | ? | ? | ? | ? | ? | ? | ? | 此指令置CF=0 | |
| CMC | ? | √ | ? | ? | ? | ? | ? | ? | ? | 此指令CF取反 | |||
| STC | ? | √ | ? | ? | ? | ? | ? | ? | ? | 此指令置CF=1 | |||
| CLD | ? | ? | ? | ? | ? | ? | √ | ? | ? | 此指令置DF=0 | |||
| STD | ? | ? | ? | ? | ? | ? | √ | ? | ? | 此指令置DF=1 | |||
| CLI | ? | ? | ? | ? | ? | ? | ? | √ | ? | 此指令置IF=0 | |||
| STI | ? | ? | ? | ? | ? | ? | ? | √ | ? | 此指令置IF=1 | |||
| 空操作 | NOP | ? ? 不影響標志位 | ? | ||||||||||
| 暫停 | HLT | ? | |||||||||||
| 等待 | WAIT | ? | |||||||||||
| 交權 | ESC | ? | |||||||||||
| 總線鎖定前綴 | LOCK | ? | |||||||||||
?
JMP 測試
? ; Test28_1.asm; .386 .model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .code main proc ? PrintText '1' ? jmp @F ? PrintText '2' ? PrintText '3' @@: PrintText '4' ? ret main endp end main ;測試結果應該是: ;1 ;4 ;以下都應該是這樣.
?
JE 測試
? ; Test28_2.asm; .386 .model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .code main proc ? PrintText '1' ? mov eax, 123 ? cmp eax, 123 ? je @F ? PrintText '2' ? PrintText '3' @@: PrintText '4' ? ret main endp end main
?
JZ 測試
? ; Test28_3.asm; .386 .model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .code main proc ? PrintText '1' ? xor eax, eax ? jz @F ? PrintText '2' ? PrintText '3' @@: PrintText '4' ? ret main endp end main
?
JS 測試
? ; Test28_4.asm; .386 .model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .code main proc ? PrintText '1' ? xor eax, eax ? dec eax ? js @F ? PrintText '2' ? PrintText '3' @@: PrintText '4' ? ret main endp end main
?
JC 測試
? ; Test28_5.asm; .386 .model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .code main proc ? PrintText '1' ? mov al, 0FFh ? add al, 1 ? jc @F ? PrintText '2' ? PrintText '3' @@: PrintText '4' ? ret main endp end main
?
JO 測試
? ; Test28_6.asm; .386 .model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .code main proc ? PrintText '1' ? mov al, -128 ? sub al, 1 ? jo @F ? PrintText '2' ? PrintText '3' @@: PrintText '4' ? ret main endp end main
?
JA 測試
? ; Test28_7.asm; .386 .model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .code main proc ? PrintText '1' ? mov eax, 22 ? cmp eax, 11 ? ja @F ? PrintText '2' ? PrintText '3' @@: PrintText '4' ? ret main endp end main
?
JG 測試
? ; Test28_8.asm; .386 .model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .code main proc ? PrintText '1' ? mov eax, 1 ? cmp eax, -1 ? jg @F ? PrintText '2' ? PrintText '3' @@: PrintText '4' ? ret main endp end main
?
JP 測試
? ; Test28_9.asm; .386 .model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .code main proc ? PrintText '1' ? mov al, 00001110b ? inc al ? jp @F ? PrintText '2' ? PrintText '3' @@: PrintText '4' ? ret main endp end main
?
JECXZ 測試
? ; Test28_10.asm; .386 .model flat, stdcall include windows.inc include kernel32.inc include masm32.inc include debug.inc includelib kernel32.lib includelib masm32.lib includelib debug.lib .code main proc ? PrintText '1' ? xor ecx, ecx ? jecxz @F ? PrintText '2' ? PrintText '3' @@: PrintText '4' ? ret main endp end main
總結
以上是生活随笔為你收集整理的【debug】汇编跳转指令: JMP、JECXZ、JA、JB、JG、JL、JE、JZ、JS、JC、JO、JP 等的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网路视屏学习资源共享
- 下一篇: 计算机信息技术指哪些专业,信息技术类专业