[MASM拾遺]Offset僞指令

  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自動關聯起來,而不用加段前綴。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章