MASM中Group的作用

美洲象發表於2024-05-15

Masm5以後推出的simplified segment模式及.model標準模型中,都將段組合成一個group,group的作用及優點是什麼呢?

一、Group的作用

  將組(group)後的所有段加入一個組,位於這些段內的的label(標號)或variables(變數)的偏移地址都參照Group的起始地址進行計算,而不是所在段的起始地址進行計算,程式碼舉例如下:

assume cs:codesg,ss:stacksg,ds:datasg1,es:datasg2
;-------------------------------------------
stacksg segment stack
    db 100 dup (0)
stacksg ends
;-------------------------------------------
datasg1 segment 
    var1 db 6
datasg1 ends
;-------------------------------------------
datasg2 segment 
    var2 db 9
datasg2 ends
;-------------------------------------------
codesg segment
    start:
;-------------------------------------------
    mov al,var1
    mov al,var2
;-------------------------------------------
    mov ax,4c00h
    int 21h
codesg ends
end start

  如果不定義組,則var1和var2的偏移地址都是0000,編譯後程式碼如下:

MASM中Group的作用

  如將datasg1和datasg2編入組:

mygroup group datasg1,datasg2
assume cs:codesg,ss:stacksg,ds:mygroup

  則編譯後程式碼如下:

MASM中Group的作用

  可見,編入組後var1和var2都參照mygroup的起始地址計算偏移地址。

  注意:

  1、assume ds:mygroup語句不能少(即將段地址和組地址進行關聯),否則組定義不啟作用。

  2、加入組的第一個段和最後一個段之間的距離不能超過65535Byte(想想為什麼)

二、Group的優點

  這樣做的好處是cpu在程式碼跳轉或資料訪問時,段暫存器不用變更(都參照group的起始地址),可以加快程式的執行速度。

三、Group知識擴充套件

  Mams5後對段的定義即劃分進行了簡化,並給出了標準化建議。如按照標準化定義段,還可以與c、basic、pascal等高階語言進行相互呼叫。

  .model tiny/small/medium/compat/large/huge(6種記憶體模型)

  tiny,程式碼和資料在一個段中,整個程式只有一個段。

  small,程式碼只有一個段,資料只有一個段。

  medium,資料只有一個段,程式碼可存在多個段。

  compat,程式碼只有一個段,資料可存在多個段。

  large,程式碼和資料都可以有多個段。

  huge,程式碼和資料都可以有多個段,且data array可以超過64K。

  

  .model指令還自動定義group和assume指令,將相應的段加入group,並將段暫存器與group關聯,如.model small,就會自動生成

dgroup group _data,const,_bss,stack
assume ds:dgroup。

  但注意,這裡需要手動為ds賦值:

mov ax,dgroup
mov ds,ax

相關文章