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

Z80汇编定义多个数值变量后首个变量取值异常如何解决

问题原因

Z80 架构采用小端序存储,且 ld bc, (内存地址) 属于16位批量加载指令:会从指定内存地址连续读取2个字节,低地址的字节存入C寄存器(低8位),高地址的字节存入B寄存器(高8位),最终拼接为16位的BC寄存器值。

你的代码中变量定义存在位宽不匹配的问题:

  • score1 defb 15 仅为score1分配了1字节内存,存储值为十六进制0x0F(十进制15)
  • 紧随其后的score2 defb 32 刚好占用了score1地址+1的内存位置,存储值为十六进制0x20(十进制32)

执行ld bc,(score1)时,实际读取的是score1和score2两个地址的字节,拼接后BC的值为 0x20 * 256 + 0x0F = 8192 + 15 = 8207,和你得到的运行结果完全一致。
当你删除score2定义时,汇编器默认会对未定义的内存区域填充0x00,此时读取的16位值为0x000F即十进制15,因此运行正常。

修复方案

根据你的使用场景可选两种修复方式:

方案1:改用8位读取指令适配单字节变量

如果score1本身就是单字节数值,只需要单独读取它的值,就不要用16位加载指令,改为8位加载后手动清空高位寄存器:

org 32768
    ld c,(score1)  ; 仅读取score1的1字节到C寄存器
    ld b,0         ; 清空B寄存器,保证BC高位为0
    call 6683
    ret

score1  defb 15
score2  defb 32

方案2:将变量定义为16位宽适配16位读取指令

如果你确实需要使用16位加载指令读取score1,就把变量的定义改为16位宽的defw(定义字):

org 32768
    ld bc,(score1)
    call 6683
    ret

score1  defw 15  ; 分配2字节存储,值为0x000F
score2  defb 32

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 07:06:02