NASM中XOR比较结果匹配二进制值但条件跳转未触发问题排查
问题分析与修复方案
你的代码逻辑出错的核心原因是在计算完乘积后,错误地覆盖了乘积结果,导致后续的异或运算使用的不是(num1+9)*num2的值,而是num1+9本身的值。
关键错误点定位
我们一步步拆解你测试输入(num1=3、num2=5、num3=2)时的代码执行流程:
- 正确计算出
bl = 3+9 = 12,bh =5 - 执行
mul bh后,ax = 12*5 =60(十进制,二进制00111100) - 但你紧接着写了
mov al, bl,这把al重新赋值为12(bl的值),直接丢弃了之前计算的乘积结果60! - 后续
xor al, cl计算的是12 XOR 2 =14(二进制00001110),而不是预期的60 XOR2=62 - 14和
0b0000110按位与的结果是0b0000010,不等于0b0000110,所以自然不会触发je high_priority跳转
修复后的代码
我们需要保留mul指令的结果(存在ax中),用这个结果去和num3做异或运算。另外还有几个小细节需要优化(比如二进制数的规范写法、避免寄存器滥用):
section .data msg1 db 'High Priority', 0xA msg1len equ $ - msg1 msg2 db 'Standard Priority', 0xA msg2len equ $ - msg2 section .bss num1 resb 2 num2 resb 2 num3 resb 2 section .text global _start _start: ; 读取num1 mov eax, 3 mov ebx, 0 mov ecx, num1 mov edx, 2 int 0x80 mov al, [num1] sub al, '0' add al, 9 ; num1 +9 mov bl, al ; 暂存到bl ; 读取num2 mov eax, 3 mov ebx, 0 mov ecx, num2 mov edx, 2 int 0x80 mov al, [num2] sub al, '0' mov bh, al ; 暂存到bh ; 计算 (num1+9)*num2,结果存在ax中 mov al, bl mov ah, 0 mul bh ; ax = al * bh = (num1+9)*num2 ; 读取num3 mov ecx, num3 mov edx, 2 mov ebx, 0 mov eax, 3 int 0x80 mov cl, [num3] sub cl, '0' ; 转换为数字 ; 用乘积结果和num3做异或 xor ax, cx ; ax = (乘积) XOR num3 ; 按位与固定值0b0000110 and ax, 0b0000110 ; 比较结果是否等于0b0000110 cmp ax, 0b0000110 je high_priority standard_priority: mov eax, 4 mov ebx, 1 mov ecx, msg2 mov edx, msg2len int 0x80 jmp exit_program high_priority: mov eax, 4 mov ebx, 1 mov ecx, msg1 mov edx, msg1len int 0x80 exit_program: mov eax, 1 int 0x80
其他优化说明
- 二进制数在NASM中规范写法是
0bxxxxxx,而非xxxxxxb,这样兼容性更好 - 读取num3时可以复用寄存器,减少重复的指令赋值
- 用
ax保存乘积结果,避免覆盖关键数据;异或和按位与操作直接对ax进行,确保使用的是正确的计算值
现在用你的测试输入运行修复后的代码,就能正确触发high_priority分支了。
内容的提问来源于stack exchange,提问作者Chaotic bandit
相关产品推荐
相关产品推荐

