请求展示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
相关产品推荐
相关产品推荐

