NASM x86-64下word类型计数器与大于0x8000值比较时跳转异常
问题根因
你遇到的问题核心是跳转指令类型选择错误:
jge是有符号数的大于等于跳转指令,16位word类型的最高位为符号位,16位有符号数的取值范围是-32768(0x8000) ~ 32767(0x7FFF)- 当nbIter≥0x8000时,16位有符号解析下它会被判定为负数,初始计数器值为0(有符号正数),
cmp word [counter], nbIter执行时,0作为正数大于所有负数,jge条件直接成立,首次迭代就跳转到end结束循环。 - nbIter<0x8000时,16位有符号、无符号的解析结果一致,因此逻辑运行正常。
修复方案
方案1:更换为无符号跳转指令(最简便)
你的计数器是用来做循环计数的,属于无符号数值场景,直接把跳转指令从jge换成jae(无符号数大于等于跳转)即可,修改后支持最大16位无符号计数上限0xFFFF:
; 修改前 cmp word [compteur], 0x7fff jge end ; 修改后,nbIter可设置为0x0~0xFFFF之间的任意值 cmp word [compteur], 0xFFFF ; 此处替换为你需要的循环次数阈值 jae end
方案2:扩大计数器位宽(适配更大计数范围)
如果需要超过65535次的循环,可以把计数器的位宽从16位word升级为32位双字/64位四字:
- 数据段修改计数器定义:
compteur: dd 0(32位)或compteur: dq 0(64位) - 对应修改比较、自增指令的操作数位宽,配合使用
eax/rax寄存器操作即可。
你之前尝试拆分字节比较未生效,是因为没有解决跳转指令按有符号数判定的核心问题,更换跳转指令即可解决该问题。
内容的提问来源于stack exchange,提问作者Yanis Bouger
相关产品推荐
相关产品推荐

