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

汇编语言中能否修改数组变量?调试时修改代码未生效求助

汇编数组修改失败的问题排查

核心代码片段的错误

你尝试的修改逻辑存在明显问题:

mov al, [bx+si]
inc ax
mov [bx+si], al
  • 若数组元素是8位字节:inc ax会错误修改ah寄存器的值(最终仅将al存回数组),应替换为inc al;
  • 若数组元素是16位字:仅读取al会丢失高8位数据,应改为mov ax, [bx+si],修改后直接执行mov [bx+si], ax。

完整代码中的其他问题

1. 栈操作混乱导致逻辑异常

调用print_enemy前连续push ax两次,但未做对应pop清理栈帧。print_enemy执行ret后,栈中残留的两个ax值会干扰后续pop cx操作——此时取出的不是初始保存的循环计数器,而是之前push的ax值,导致循环次数完全错误,后续数组访问的si索引也会混乱。

2. 寄存器比较逻辑错误

这段代码存在寄存器匹配错误:

mov al, [bx+si]
cmp ax,0
je endPritingLoop

仅将数组元素加载到al(ax的低8位),却用16位的ax和0比较。此时ah寄存器保留着之前操作的残留值,cmp ax,0几乎永远不会成立,导致跳过修改逻辑的分支完全失效。若数组元素是8位,应改为cmp al,0;若是16位,应改为mov ax, [bx+si]; cmp ax,0。

3. si索引的步进逻辑混乱

你的si操作存在重复增减:

  • 先inc si两次,再sub si,2回到初始位置
  • 修改数组后又inc si,最后add si,2
    这种来回调整极易导致si指向错误的数组元素,使得你修改的根本不是目标位置的数值。建议明确数组元素大小(8位/16位)后,统一si的步进值(比如1字节元素每次+1,2字节元素每次+2),避免反复增减。

内容的提问来源于stack exchange,提问作者omer GUR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 14:47:40