You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求展示cmp/test与js/jns/jz/jnz等指令的类C用法示例

汇编指令与条件跳转的类C等价示例

下面是汇编中cmp/test指令搭配js/jns/jz/jnz等条件跳转的类C等价示例,帮你直观理解这些指令的执行逻辑:

一、cmp 指令搭配条件跳转

cmp a, b 本质是计算 a - b,根据结果设置标志位(符号位SF、零标志位ZF等),但不会保存减法结果。后续的条件跳转基于这些标志位判断:

1. cmp + js(结果为负时跳转,对应有符号数a < b)

汇编代码:

cmp eax, ebx
js  negative_label
; 当 eax >= ebx 时执行此处代码
negative_label:
; 当 eax < ebx 时执行此处代码

类C等价:

if (eax < ebx) {
    // 执行negative_label处的逻辑
} else {
    // 执行跳转前的逻辑
}

2. cmp + jns(结果非负时跳转,对应有符号数a >= b)

汇编代码:

cmp eax, ebx
jns non_negative_label
; 当 eax < ebx 时执行此处代码
non_negative_label:
; 当 eax >= ebx 时执行此处代码

类C等价:

if (eax >= ebx) {
    // 执行non_negative_label处的逻辑
} else {
    // 执行跳转前的逻辑
}

3. cmp + jz(结果为0时跳转,对应a == b)

jz 也可写作 je(jump if equal),语义完全一致。
汇编代码:

cmp eax, 0x10
jz  equal_label
; 当 eax != 0x10 时执行此处代码
equal_label:
; 当 eax == 0x10 时执行此处代码

类C等价:

if (eax == 0x10) {
    // 执行equal_label处的逻辑
} else {
    // 执行跳转前的逻辑
}

4. cmp + jnz(结果不为0时跳转,对应a != b)

jnz 也可写作 jne(jump if not equal),语义完全一致。
汇编代码:

cmp eax, ebx
jnz not_equal_label
; 当 eax == ebx 时执行此处代码
not_equal_label:
; 当 eax != ebx 时执行此处代码

类C等价:

if (eax != ebx) {
    // 执行not_equal_label处的逻辑
} else {
    // 执行跳转前的逻辑
}

二、test 指令搭配条件跳转

test a, b 是计算 a & b(按位与),根据结果设置标志位,但不会保存与运算结果。常用于判断数值是否为0、某一位是否置位等场景:

1. test + jz(按位与结果为0时跳转,常用作判断数值是否为0)

汇编代码:

test ecx, ecx
jz  zero_label
; 当 ecx != 0 时执行此处代码
zero_label:
; 当 ecx == 0 时执行此处代码

类C等价:

if (ecx == 0) {
    // 执行zero_label处的逻辑
} else {
    // 执行跳转前的逻辑
}

2. test + jnz(按位与结果不为0时跳转,常用作判断某一位是否置位)

汇编代码:

test edx, 0x04  ; 判断edx的第2位(从0开始计数)是否为1
jnz bit_set_label
; 当edx第2位为0时执行此处代码
bit_set_label:
; 当edx第2位为1时执行此处代码

类C等价:

if (edx & 0x04) {  // 等价于 (edx >> 2) & 1 == 1
    // 执行bit_set_label处的逻辑
} else {
    // 执行跳转前的逻辑
}

3. test + js(按位与结果最高位为1时跳转,对应有符号数为负)

汇编代码:

test eax, 0x80000000  ; 32位eax的最高位是符号位
js  negative_num_label
; 当eax >= 0时执行此处代码
negative_num_label:
; 当eax < 0时执行此处代码

类C等价:

if ((int)eax < 0) {
    // 执行negative_num_label处的逻辑
} else {
    // 执行跳转前的逻辑
}

4. test + jns(按位与结果最高位为0时跳转,对应有符号数非负)

汇编代码:

test eax, 0x80000000
jns non_negative_num_label
; 当eax < 0时执行此处代码
non_negative_num_label:
; 当eax >= 0时执行此处代码

类C等价:

if ((int)eax >= 0) {
    // 执行non_negative_num_label处的逻辑
} else {
    // 执行跳转前的逻辑
}

内容的提问来源于stack exchange,提问作者R-Rothrock

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 12:37:09