【问题标题】:Alternative to the: mov ax,data mov ds,ax instruction替代: mov ax,data mov ds,ax 指令
【发布时间】:2017-10-19 11:43:58
【问题描述】:

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

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

【问题讨论】:

  • 我知道,对不起,但我必须以某种方式使用数组。
  • 也许他们正在考虑用LEA SI, array替换MOV SI, OFFSET array
  • idk,如果是这样的话会很容易,但这里有一个确切的问题:使用数组向 MOV AX,DATA 编写等效指令。 (3 分)
  • 真的不知道,但谢谢你的尝试,我很感激。会给讲师发邮件,但他通常不喜欢给提示。
  • 我突然想到他们可能会要求将MOV AX, DATA 替换为MOV AX, seg array

标签: assembly x86 x86-16 emu8086


【解决方案1】:

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

LEA AX, DATA

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

【讨论】:

    【解决方案2】:

    TL;DRmov AX, SEG array


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

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

    这样说的话,答案就更清楚了。当一个标签被放置到一个段中时,这个标签既有一个相对于段开始的偏移量,也有一个段值。当使用允许多个数据段的内存模型生成可执行文件时,这可以派上用场。对于mov ax, DATADATA 是段的名称,因此该指令将段值移动到 AX1

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

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

    等效的指令是:

    mov AX, SEG array
    

    这会将array 的段值移动到AX。由于arrayDATA 段中,它使两条指令等效。


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

    【讨论】:

      猜你喜欢
      • 2011-07-18
      • 2015-11-27
      • 1970-01-01
      • 2022-12-18
      • 2017-04-06
      • 1970-01-01
      • 1970-01-01
      • 2011-10-25
      相关资源
      最近更新 更多