Offset僞指令我一直都認爲只是獲取標識符在段中的偏移地址,但經研究,發現了部分違反直覺的細微區別:
1、在完整端聲明(Full segment definition)的模式下
如果offset mygroup:myvar或offset mysegment:myvar,可通過端前綴來獲取myvar與group開頭位置的偏移地址或myvar與mysegment開頭位置的偏移地址。
這裏要注意的是offset並不受group的定義和assume的影響,因此無論myvar是否加入了組,只要offset myvar就只計算myvar與所在段的偏移地址,否則就加上段前綴mygroup:myvar或othersegment:myvar。
如下代碼(Masm 5.00編譯通過):
mygroup group datasg1,datasg2
assume cs:codesg,ds:mygroup
datasg1 segment public
myvar1 db 55,66
datasg1 ends
datasg2 segment public
myvar2 db 88,99
datasg2 ends
stacksg segment stack
db 256 dup(?)
stacksg ends
codesg segment
start:
mov al,myvar1
mov al,myvar2
mov ax,offset myvar1
mov ax,offset myvar2
mov ax,offset mygroup:myvar1
mov ax,offset mygroup:myvar2
mov ax,offset datasg1:myvar2
mov ax,4c00h
int 21h
codesg ends
end start
編譯後的結果是:
2、在簡單段聲明(Simplified segment definition)的模式下
如果myvar爲near,則offset返回myvar在group中的偏移地址;如果myvar爲far,則返回myvar在segment中的偏移地址。
因爲在簡單段聲明模式下,默認將段加入了組,並且offset的計算才與group自動關聯起來,而不用加段前綴。