我正在通過一些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。