You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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位四字:

  1. 数据段修改计数器定义:compteur: dd 0 (32位)或 compteur: dq 0(64位)
  2. 对应修改比较、自增指令的操作数位宽,配合使用eax/rax寄存器操作即可。

你之前尝试拆分字节比较未生效,是因为没有解决跳转指令按有符号数判定的核心问题,更换跳转指令即可解决该问题。

内容的提问来源于stack exchange,提问作者Yanis Bouger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 07:24:00