16位汇编代码中的OFFSET是什么意思?

Wit*_*eso 16 x86 assembly masm 16-bit x86-16

我将通过一些16位实模式的汇编代码示例.

我遇到过这样的问题:

    mov    bx, cs
    mov    ds, bx
    mov    si, OFFSET value1
    pop    es
    mov    di, OFFSET value2
Run Code Online (Sandbox Code Playgroud)

这是做什么的?"OFFSET"有什么作用?

Nat*_*man 19

正如其他一些答案所说,offset关键字指的是与定义它的段的偏移量.然而,注意,片段可以重叠,并且一个片段中的偏移在另一个片段中可以是不同的.例如,假设您在实模式下有以下段

data SEGMENT USE16 ;# at segment 0200h, linear address 2000h

    org 0100h
    foo db 0

    org 01100h
    bar db 0

data ENDS
Run Code Online (Sandbox Code Playgroud)

汇编程序看到它foo偏离0100h了基数data SEGMENT,所以无论它在哪里,offset foo它都会放置值0100h,而不管当时的值DS.

例如,如果我们更改DSdata汇编程序假定的段以外的其他内容:

mov ax, 200h            ; in some assemblers you can use @data for the seg base
mov ds, ax

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


mov ax, 300h
mov ds, ax

mov bx, offset foo          ; bx = 0100h
mov byte ptr [bx], 10       ; bar = 10, not foo, because DS doesn't match what we told the assembler
Run Code Online (Sandbox Code Playgroud)

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


cop*_*kin 9

它只是意味着该符号的地址.如果您熟悉它,它有点像C中的&运算符.