汇编语言中[offset someData]的确切含义

时间:2014-04-06 16:30:33

标签: assembly offset memory-address

我的问题是汇编语言中的OFFSET

我编写了以下代码:(emu8086)

data segment
DATA1  dw 6
DATA2 dw 5
ends

stack segment
dw   128  dup(0)
ends

code segment
start:

mov ax, data
mov ds, ax
mov es, ax



mov bx, [offset DATA1]
mov ax, [offset DATA2]


mov ax, 4c00h ; exit to operating system.
int 21h    
ends

end start ; set entry point and stop the assembler.

我在输入[offset DATA1]时排除了我收到6,当我输入[offset DATA2]时,我收到5。

我的理由是:offset为我们提供了数据的地址,此符号[]为我们提供了上述内存位置的内容。所以当我们使用[offset data1]时,我们应该收到data1(这里是6)

但结果是其他一些事情。运行此代码后,ax是0006H,bx是0000H,我无法理解为什么。

任何人都可以帮助我理解[offset someData]的含义吗?

我知道这是非常基本的,但我是装配新手。

提前感谢您的关注

1 个答案:

答案 0 :(得分:0)

我尝试使用TASM汇编代码,并按预期收到BX = 0和AX = 2:

cs:0000 B88F4E         mov    ax,4E8F
cs:0003 8ED8           mov    ds,ax
cs:0005 8EC0           mov    es,ax
cs:0007 BB0000         mov    bx,0000
cs:000A B80200         mov    ax,0002
cs:000D B8004C         mov    ax,4C00
cs:0010 CD21           int    21

在大多数汇编程序中, MOV reg,变量将使用变量contens加载带变量偏移的reg和 MOV reg,[变量] 。这不是MASM的情况,它将 MOV reg,变量解释为使用内存变量内容加载reg并且你必须明确地写 MOV reg,OFFSET变量来加载偏移变量地址的一部分。你的语法是混淆的,它是使用汇编程序的业务,它是否会解析 MOV reg,[offset variable] 作为偏移或内容或产生一些警告。 如果要加载DATAx的内容,请忽略偏移一词。您可能还需要指定 ASSUME DS:data 来告诉汇编器您已经使用段地址加载了DS寄存器。