首页 > 解决方案 > 如何在数据段之间切换?

问题描述

我刚开始学习Assembly(我有基础),但我不知道如何在数据段之间切换。这是和示例:

    FRASE DB 'Inserisci un numero : ','$'
DATA ENstrong textDS
DATA2 SEGMENT PUBLIC 'DATA'
    VET DB 20 DUP (?)
DATA2 ENDS    
CSEG SEGMENT PUBLIC 'CODE'
    ASSUME CS:CSEG, DS:DATA

MAIN PROC FAR

    MOV AX,SEG DATA
    MOV DS,AX
    MOV DI,SEG DATA2
    XOR AX,AX
    MOV CX,20

    MOV DX,0
    LEA SI,VET

    VETTORE : 

    MOV AH,0
    INT 16H
    ADD SI,DX
    MOV [SI],AL
    INC DX
    LOOP VETTORE
    MOV AH,4CH
    INT 21H**

我用emu8086来检查内存是如何工作的,我得到了这个结果。程序创建数据段并存储 var FRASE 的偏移量。

之后,我将另一个数据段保存在 DI 寄存器中。然后,我要求用户输入一个数字,问题是:当它将数字保存在 AL 中,然后我将其复制到 [SI] 内存地址中时,它会将其复制到第一个数据段中。

我试图更好地解释,第一个数据有 0712 地址,第二个有 0712,我想将数字保存在 0712:0000,而不是 0710:0000(它会覆盖变量 FRASE)。

标签: assemblyx86-16emu8086memory-segmentation

解决方案


将另一个段地址放入 DI 寄存器不会做任何事情,因为机器不会在那里寻找它。对内存的引用总是针对其地址存储在段寄存器 CS、DS、ES、SS 之一中的段进行的。对于带有 [SI] 引用的 MOV,除非您使用覆盖前缀,否则默认使用 DS。

如果您想继续使用 DS 处理 DATA 段中的内容,那么 ES 是最合理的选择。所以你可以写

MOV DI, DATA2
MOV ES, DI
MOV [ES:SI], AL

推荐阅读