TASM中JL指令跳转不符合预期问题求助
问题分析与解决
你的问题根源在于用错了比较跳转指令:JG和JL是有符号数专属的比较跳转指令,但你实际要做的是无符号16位数值的比较。
具体原因
当AX的值为FFFFh时,作为有符号数它代表-1,而BX的03E8h是有符号数1000。执行cmp ax, bx后,CPU会按照有符号数逻辑判定-1 < 1000,所以触发JL跳转到less段——这是指令的正常行为,但和你预期的无符号比较结果不符。
解决方法
把有符号比较指令替换为无符号比较指令:
- 用
JA(Jump if Above,无符号大于)替代JG - 用
JB(Jump if Below,无符号小于)替代JL
修改后的代码片段:
mov ax, word ptr dd_buf mov bx, word ptr powers_of_10[di] cmp ax, bx ja greater jb less greater: mov dx, offset greater_output_hint call putstr call clrf jmp end less: mov dx, offset less_output_hint call putstr call clrf
补充说明
x86汇编的跳转指令严格区分有符号/无符号场景:
- 有符号数比较:
JG(大于)、JL(小于)、JGE(大于等于)、JLE(小于等于) - 无符号数比较:
JA(高于)、JB(低于)、JAE(高于等于)、JBE(低于等于)
需根据数值的实际含义选择对应指令。
内容的提问来源于stack exchange,提问作者ph1l1a
相关产品推荐
相关产品推荐

