基本上我有一个任务,&有一些简单的代码,但其中一个问题是键入一个等效的指令:
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
答案 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, DATA
,DATA
是段的名称,因此该指令将段值移动到 AX 1 。
给定一个细分中的标签,您如何获得细分值?答案很简单。大多数使用 MASM / TASM 的人使用 OFFSET 关键字来获取内存中标签的偏移量(相对于片段)。关键字 SEG 类似,但代表包含标签的细分的细分值。
段和偏移量创建segment:offset对,这是在16位寄存器的实模式下访问1MiB的基础。
本来相当的指令应该是:
mov AX, SEG array
这会将array
的细分值移动到 AX 。由于array
位于DATA
段,因此它使两条指令等效。
1 段值由DOS EXE程序加载器修复,因为只有在程序加载到RAM时才完全知道它们。