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

汇编语言无法将变量赋值到指定内存地址问题求助

汇编内存写入问题排查与解决

我是汇编新手,尝试把几个数值写入起始地址为0800:0010的内存区域,过程中遇到了几个问题:

最初尝试的代码

.data    
    NUM0 DB 00H
    NUM1 DB 22H
    NUM2 DB 00H
    NUM3 DB 35H
    NUM4 DB 71H
    NUM5 DB 03H
.code            
    MOV AX, 0800H
    MOV DS, AX
    
    MOV AX, 0010H
    MOV ES, AX
    
    MOV DS:[0010], NUM1
    MOV DS:[0011], NUM2
    MOV DS:[0012], NUM3
    MOV DS:[0013], NUM4
    MOV DS:[0014], NUM5

报错信息

(15) wrong parameters: MOV [0000], NUM1

替代代码(无报错但有异常)

.data    
    NUM0 DB 00H
    NUM1 DB 22H
    NUM2 DB 00H
    NUM3 DB 35H
    NUM4 DB 71H
    NUM5 DB 03H
.code            
    MOV AX, 0800H
    MOV DS, AX
    
    MOV AX, 0010H
    MOV ES, AX
    
    MOV AL, NUM1
    MOV DS:[0010], AL
    MOV AL, NUM2
    MOV DS:[0011], AL
    MOV AL, NUM3
    MOV DS:[0012], AL
    MOV AL, NUM4
    MOV DS:[0013], AL
    MOV AL, NUM5
    MOV DS:[0014], AL

异常现象

  • 目标内存地址0800:0010始终为空
  • 无关变量NUM0删除后,NUM1的值会变成57H,保留NUM0则NUM1恢复为22H
  • 调试发现DS寄存器初始值为0100,执行MOV DS, AX后变为0000而非预期的0800H

问题分析与解决

1. 最初代码的参数错误原因

汇编里MOV指令不支持内存到内存的直接传输,MOV DS:[0010], NUM1是想把内存变量NUM1的值直接写到内存地址DS:0010,这种操作非法,必须通过寄存器中转——这也是你后来改用AL中转的原因,但后续还有其他核心问题。

2. DS寄存器赋值异常的核心问题

你调试时发现MOV DS, AX后DS变成0000,本质是因为:实模式下汇编器会给.data段分配固定段地址,当你把DS改成0800H后,再访问NUM1等变量时,实际寻址是0800H:NUM1的偏移量,这根本不是你定义的.data段里的NUM1了!

正确逻辑是:先把.data段的变量值读到寄存器(此时DS还指向.data段),再修改DS为目标段,代码示例:

.data    
    NUM0 DB 00H
    NUM1 DB 22H
    NUM2 DB 00H
    NUM3 DB 35H
    NUM4 DB 71H
    NUM5 DB 03H
.code            
    ; 先读取.data段变量到寄存器,此时DS默认指向.data段
    MOV AL, NUM1
    MOV BL, NUM2
    MOV CL, NUM3
    MOV DL, NUM4
    MOV AH, NUM5

    ; 修改DS为目标段0800H
    MOV AX, 0800H
    MOV DS, AX
    
    ; 写入目标内存地址
    MOV DS:[0010], AL
    MOV DS:[0011], BL
    MOV DS:[0012], CL
    MOV DS:[0013], DL
    MOV DS:[0014], AH

3. NUM0删除后NUM1值异常的原因

汇编器对.data段的变量按顺序分配偏移地址,NUM0占偏移0的位置,删除后NUM1的偏移变为0。但你之前改了DS为0800H,访问NUM1时实际读的是0800H:0000这个陌生地址的随机值,也就是你看到的57H——本质还是寻址错误。

4. 目标内存为空的原因

同样是寻址错误:你改完DS为0800H后再读NUM1,读的是0800H:NUM1偏移的随机值(大概率是0),再写入0800H:0010,自然看不到预期的22H等数值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 21:22:52