替代:mov ax,data mov ds,ax指令

时间:2017-10-19 11:43:58

标签: assembly x86 x86-16 emu8086

基本上我有一个任务,&有一些简单的代码,但其中一个问题是键入一个等效的指令:

mov ax,data

在数据段内使用标签(数组),&我无法弄清楚或发现任何内容:

 CODE   SEGMENT
 START: MOV AX, DATA
 MOV DS, AX
 MOV CX, 3
 MOV SI, OFFSET array
ITER: MOV AX, [SI]
XCHG AH, AL
ROL AX, 1
INC SI
AND [SI], AX
LOOP ITER
ENDS

DATA    SEGMENT
DB 1 DUP (0)
array DB 0B9H,8BH,01H,70H,02H,06H,34H,0CH ; this one here
ENDS

END START

2 个答案:

答案 0 :(得分:0)

我无法弄清楚你真正想要的是什么。 但如果你想要替代品  MOV AX, DATA
这可以用 -

LEA AX, DATA

LEA 加载有效地址,它将使用DATA的第一个地址加载AX。

答案 1 :(得分:0)

TL; DR mov AX, SEG array

根据OP,我在答案中的评论似乎是正确的。起初它并不完全清楚被问到的是什么,但这似乎是个问题:

  

使用array段内定义的标签DATA,提供与mov AX,DATA相等的另一条指令

如果这样措辞,答案就更清楚了。将标签放入段中时,标签具有相对于段开头的偏移量和段值。当使用可能允许多个数据段的内存模型生成可执行文件时,这可以派上用场。对于mov ax, DATADATA是段的名称,因此该指令将段值移动到 AX 1

给定一个细分中的标签,您如何获得细分值?答案很简单。大多数使用 MASM / TASM 的人使用 OFFSET 关键字来获取内存中标签的偏移量(相对于片段)。关键字 SEG 类似,但代表包含标签的细分的细分值。

段和偏移量创建segment:offset对,这是在16位寄存器的实模式下访问1MiB的基础。

本来相当的指令应该是:

mov AX, SEG array

这会将array的细分值移动到 AX 。由于array位于DATA段,因此它使两条指令等效。

1 段值由DOS EXE程序加载器修复,因为只有在程序加载到RAM时才完全知道它们。