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.
例如,如果我们更改DS为data汇编程序假定的段以外的其他内容:
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)
在第二个例子DS中0300h,所以指向的段的基数DS是03000h.这意味着ds:[offset foo]指向地址03000h + 0100h,其是相同的02000h + 01100h,它指向bar.