x86汇编中cmp比较dl寄存器后jge跳转异常是什么原因?
问题根本原因
跳转异常的核心是混淆了有符号数跳转指令和无符号数跳转指令的适用场景:
dl是8位寄存器,你传入的dx初始值为0xdada,因此dl的值为0xda,二进制表示为11011010jge是有符号数的条件跳转指令,判断逻辑为「比较结果大于等于0时跳转」。8位有符号数的最高位为符号位,0xda作为有符号数的实际值为-38,小于0,因此jge条件不满足,代码直接执行后续的jmp print_hex_epilogue,跳过了所有打印赋值逻辑,最终输出初始的0x0000。
修复方案
- 如果你需要保留条件判断逻辑,且判断的是无符号数值大于等于0(注:8位无符号数所有取值都≥0,该判断本身无实际意义),可以将
jge替换为无符号大于等于跳转指令jae - 更合理的优化是直接删除第5、6、7行的判断跳转逻辑,所有输入值都直接进入打印处理分支即可。
代码中存在的其他问题
- 第17行的
and dl, 0xf被注释:xlat指令以al的值为偏移从HEX_TABLE中取字符,0xda远大于表长15,会访问表外内存得到非法字符 - 当前代码仅处理了
dl的低4位,仅修改了HEX_OUT的最后两位,dx的高8位dh、dl的高4位完全没有处理,无法完整打印16位的dx值 - 第12行写死
mov al, '1',会导致打印结果的倒数第二位永远为1,不符合十六进制打印的需求
内容的提问来源于stack exchange,提问作者kirugan
相关产品推荐
相关产品推荐

