我的问题是汇编语言中的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]
的含义吗?
我知道这是非常基本的,但我是装配新手。
提前感谢您的关注
答案 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寄存器。