【问题标题】:What does SEG directive do in 8086?SEG 指令在 8086 中做了什么?
【发布时间】:2013-01-25 19:04:01
【问题描述】:

SEG A

Assigns the content held in segment register corresponding to the segment in which A resides to the operand.

我猜这意味着如果A 位于数据段中,SEG ADS 相同。

由于DS 保存了数据段的基地址,所以

MOV AX, LEA A
MOV DX, SEG A
MOV AX, [AX + DX]

A物理地址复制到AX

【问题讨论】:

  • 请标记您正在使用的汇编程序(MASM、NASM、TASM...)。

标签: assembly x86-16 tasm


【解决方案1】:

我猜这意味着如果 A 位于 Data Segment 中,SEG A 与 DS 相同。

正确,如果 DS 指向数据段。

确实
MOV AX, LEA A
MOV DX, SEG A
MOV AX, [AX + DX]
将A的物理地址复制到AX?

最后一条指令无效,它在任何 x86 CPU 中都不存在。因此,这段代码什么都不做。如果有的话,它只是位于一个 .asm 文件中,等待更正和组装。

【讨论】:

  • 如果我使用 MULADD 指令将 DX 乘以 16 并添加到 AX 会怎样?
  • 如果操作正确,当然可以。请记住,物理地址将需要超过 16 位。将 16 位值乘以 16(或等效地将其向左移动 4 个位置)使其成为 20 位。
【解决方案2】:

它将AX + DX地址(即A)的内容复制到AX。

MOV AX, LEA A ; Copy A offset to AX
MOV DX, SEG A ; Copy A segment to DX
MOV AX, [AX + DX] ; Copy A to AX

【讨论】:

  • 哦,是的。我错过了取消引用。谢谢你。那么第二行“将DS寄存器的内容复制到DX”?
  • 是的,我从你的问题中假设是这样。从未使用过 TASM,也从未见过 SEG 指令。您可以调试以确保。
  • mov ax, [ax + dx] 只会让你的汇编器呕吐——没有这样的指令!地址(在 16 位模式下)是 segreg * 16 + offset 中的值。
  • @FrankKotler,啊,是的,我的错。我没有测试这段代码。所以,如果我想这样做,我将不得不使用 MULADD 指令?
【解决方案3】:

SEG 提供操作数段。如果没有段寄存器引用变量段,则可以使用 SEG。但除此之外,您应该使用 LEA、LDS。 示例:

 .data

变量数据库? 。代码 x 分贝?

开始: ...

对于 var SEG 是 DS,对于 x SEG 是 CS,它们的段地址。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-28
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    相关资源
    最近更新 更多