我正在通过一些16位实模式的示例汇编代码。16位汇编代码中的OFFSET是什么意思?
我遇到的台词:
mov bx, cs
mov ds, bx
mov si, OFFSET value1
pop es
mov di, OFFSET value2
这是什么做的? “OFFSET”在那里做什么?
对不起,如果它是一个非常基本的问题,我是新来的。
我正在通过一些16位实模式的示例汇编代码。16位汇编代码中的OFFSET是什么意思?
我遇到的台词:
mov bx, cs
mov ds, bx
mov si, OFFSET value1
pop es
mov di, OFFSET value2
这是什么做的? “OFFSET”在那里做什么?
对不起,如果它是一个非常基本的问题,我是新来的。
正如其他一些答案所说,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
。
在第二个例子中,DS
是0300h
,所以DS
指向的段的基址是03000h
。这意味着ds:[offset foo]
指向地址03000h + 0100h
,它与02000h + 01100h
相同,它指向bar
。
编辑:在代码
它只是表示该符号的地址。这有点像C中的&运算符,如果你对此熟悉的话。
在x86 16位模式下,地址空间不平坦;相反,地址由一个偏移量和一个“段”组成。 “段”指向64K空间,偏移量在该空间内。
offset
意味着si
寄存器将是等于偏移可变VALUE1(不是其实际值)的。偏移量是存储变量的内存段开头的地址。偏移量通常是相对于ds
段(在您的情况下,ds
和cs
寄存器指向相同的段)。
偏移校正逻辑错误基本上是从段点(也称为基准点)的距离。例如 段地址是0000并且偏移量或逻辑地址是0100,则物理地址可以通过添加两对来计数。 物理地址= 0000 + 0100 = 0100 意味着我们的居民点是对0100 同样,如果段地址是1DDD地址和偏移量为0100,则: 物理地址是:1DDD + 0100 = 1EDD
手段我们的目的地是1EDD。