汇编语言无法将变量赋值到指定内存地址问题求助
汇编内存写入问题排查与解决
我是汇编新手,尝试把几个数值写入起始地址为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
相关产品推荐
相关产品推荐

