2009-11-03 75 views

回答

15

正如其他一些答案所说,offset关键字指的是它所在的段的偏移量。但是,请注意,分段可能会重叠,并且一个分段中的偏移可能在另一个分段中不同。举例来说,假设您在实模式下段

data SEGMENT USE16 ;# at 02000h 

    org 0100h 
    foo db 0 

    org 01100h 
    bar db 0 

data ENDS 

再看看下面的代码:

mov ax, 2000h 
mov ds, ax 

mov bx, offset foo ; bx = 0100h 
mov byte ptr [bx], 10 ; foo = 10 

mov ax, 3000h 
mov ds, ax 

mov bx, offset foo; bx = 0100h 
mov byte ptr [bx], 10 ; bar = 10 

汇编器发现这foo是从data SEGMENT基本偏移0100h,所以无论它看到offset foo它会将值0100h,而不管当时的值为DS

在第二个例子中,DS0300h,所以DS指向的段的基址是03000h。这意味着ds:[offset foo]指向地址03000h + 0100h,它与02000h + 01100h相同,它指向bar

编辑:在代码

6

它只是表示该符号的地址。这有点像C中的&运算符,如果你对此熟悉的话。

3

offset意味着si寄存器将是等于偏移可变VALUE1(不是其实际值)的。偏移量是存储变量的内存段开头的地址。偏移量通常是相对于ds段(在您的情况下,dscs寄存器指向相同的段)。

1

偏移校正逻辑错误基本上是从段点(也称为基准点)的距离。例如 段地址是0000并且偏移量或逻辑地址是0100,则物理地址可以通过添加两对来计数。 物理地址= 0000 + 0100 = 0100 意味着我们的居民点是对0100 同样,如果段地址是1DDD地址和偏移量为0100,则: 物理地址是:1DDD + 0100 = 1EDD

手段我们的目的地是1EDD。