汇编跳转指令

本文详细介绍了汇编语言中的各类跳转指令及其应用场景,包括无条件跳转、条件跳转以及根据CX、ECX寄存器值的跳转等,并通过具体示例展示了这些指令的实际使用。
跳转指令分三类:
一、无条件跳转: JMP;
二、根据 CX、ECX 寄存器的值跳转: JCXZ(CX 为 0 则跳转)、JECXZ(ECX 为 0 则跳转);
三、根据 EFLAGS 寄存器的标志位跳转, 这个太多了.

根据标志位跳转的指令:

JE   ;等于则跳转
JNE  ;不等于则跳转

JZ   ;为 0 则跳转
JNZ  ;不为 0 则跳转

JS   ;为负则跳转
JNS  ;不为负则跳转

JC   ;进位则跳转
JNC  ;不进位则跳转

JO   ;溢出则跳转
JNO  ;不溢出则跳转

JA   ;无符号大于则跳转
JNA  ;无符号不大于则跳转
JAE  ;无符号大于等于则跳转
JNAE ;无符号不大于等于则跳转

JG   ;有符号大于则跳转
JNG  ;有符号不大于则跳转
JGE  ;有符号大于等于则跳转
JNGE ;有符号不大于等于则跳转

JB   ;无符号小于则跳转
JNB  ;无符号不小于则跳转
JBE  ;无符号小于等于则跳转
JNBE ;无符号不小于等于则跳转

JL   ;有符号小于则跳转
JNL  ;有符号不小于则跳转
JLE  ;有符号小于等于则跳转
JNLE ;有符号不小于等于则跳转

JP   ;奇偶位置位则跳转
JNP  ;奇偶位清除则跳转
JPE  ;奇偶位相等则跳转
JPO  ;奇偶位不等则跳转


跳转相关的标志位:
11 10 9 8 7 6 5 4 3 2 1 0
OF DF IF TF SF ZF   AF   PF   CF

     








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
### 关于汇编语言中的 `CMPQ` 指令跳转指令 #### CMPQ 指令详解 `CMPQ` 是用于比较两个64位整数值的指令。该指令通过计算两个操作数之差并仅设置条件码而不修改任何寄存器的内容[^1]。 ```assembly cmpq %rbx, %rax # 将 RAX 和 RBX 中的值相减,并根据结果设置标志位 ``` 此命令会更新 CPU 的状态标志,特别是零标志 (ZF),符号标志 (SF),溢出标志 (OF) 及进位标志 (CF)[^2]。 #### 跳转指令概述 跳转指令允许程序控制流发生改变。这些指令可以有条件执行也可以无条件执行。对于有条件的跳转指令来说,它们依赖之前由诸如 `CMPQ` 这样的指令所设定的状态标志来进行决策[^3]。 ##### 条件跳转指令举例 - **JE/JZ**: 当 ZF=1(即两数相等或上一次运算的结果为0)时跳跃。 - **JNE/JNZ**: 当 ZF=0(即两数不相等或上次运算结果非零)时跳跃。 - **JL/JS**: 如果 SF=1 则表示负数情况下的小于关系;如果 OF≠SF 表明有带符号溢出,则可能发生错误判断。 下面是一个简单的例子展示如何结合使用 `CMPQ` 和条件跳转: ```assembly .global _start .section .text _start: movq $5, %rax # 设置第一个数字到RAX movq $7, %rbx # 设置第二个数字到RBX cmpq %rbx, %rax # 对比 RAX 和 RBX 的值 je equal # 若两者相同则跳至 'equal' 标签处 not_equal: # 不同情况下继续往下走... # 执行某些代码... jmp end # 结束前跳过其他部分 equal: # 相等情况处理逻辑... # 处理相等情况... end: # 清理工作和退出... movq $60, %rax # Linux 系统调用编号 60 - exit() xorq %rdi, %rdi # 返回给操作系统成功状态码 0 syscall # 发起系统调用以终止进程 ``` 在这个例子中,当 `RAX` 和 `RBX` 中存储的数据被发现相等时,程序将跳转到标签 `equal` 并在那里执行相应的代码路径;如果不相等,则会按照顺序依次运行直到遇到另一个无条件跳转 (`jmp`) 或者到达文件结尾[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值