MASM中Group的作用及內(nèi)存模型
Masm5以后推出的simplified segment模式及.model標(biāo)準(zhǔn)模型中,都將段組合成一個(gè)group,group的作用及優(yōu)點(diǎn)是什么呢?
一、Group的作用
??將組(group)后的所有段加入一個(gè)組,位于這些段內(nèi)的的label(標(biāo)號(hào))或variables(變量)的偏移地址都參照Group的起始地址進(jìn)行計(jì)算,而不是所在段的起始地址進(jìn)行計(jì)算:
??1、多數(shù)據(jù)段代碼舉例如下
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,編譯后代碼如下:

??如將datasg1和datasg2編入組:
mygroup group datasg1,datasg2
assume cs:codesg,ss:stacksg,ds:mygroup
??則編譯后代碼如下:

??可見,編入組后var1和var2都參照mygroup的起始地址計(jì)算偏移地址。?
??2、多代碼段代碼舉例如下
assume cs:codesg,ss:stacksg,ds:datasg
;-------------------------------------------
stacksg segment stack
db 100 dup (0)
stacksg ends
;-------------------------------------------
datasg segment
var1 db 6
datasg ends
;-------------------------------------------
codesg segment
start:
;-------------------------------------------
mov al,var1
jmp far ptr funone
;-------------------------------------------
mov ax,4c00h
int 21h
codesg ends
;-------------------------------------------
assume cs:excode
excode segment
funone:
mov ax,2222h
excode ends
;-------------------------------------------
end start
??其中jmp funone由于已經(jīng)跨段,所以應(yīng)該是jmp far ptr funone,如果改成jmp funone,編譯就會(huì)出現(xiàn)錯(cuò)誤
??
??將2個(gè)代碼段加到一個(gè)組中,則可以直接jmp funone,代碼如下:
cgroup group codesg,excode
assume cs:cgroup,ss:stacksg,ds:datasg
;-------------------------------------------
stacksg segment stack
db 100 dup (0)
stacksg ends
;-------------------------------------------
datasg segment
var1 db 6
datasg ends
;-------------------------------------------
codesg segment
start:
;-------------------------------------------
mov al,var1
jmp funone
;-------------------------------------------
mov ax,4c00h
int 21h
codesg ends
;-------------------------------------------
excode segment
funone:
mov ax,2222h
excode ends
end start
??邏輯上codesg和excode組合成一個(gè)段,段地址是cgroup的首地址(也就是組中第一個(gè)代碼段的地址)。
??注意:
??1、assume ds:mygroup、assume cs:cgroup語句不能少(即將段地址和組地址進(jìn)行關(guān)聯(lián)),否則組定義無意義。
??2、加入組的第一個(gè)段和最后一個(gè)段之間的距離不能超過65535Byte(想想為什么)。
??3、Group并不改變段在內(nèi)存的位置,只是改變組內(nèi)代碼和數(shù)據(jù)的訪問方式:因?yàn)槎x在不同段的代碼需要通過far ptr來跨段訪問 ,數(shù)據(jù)則需要改變段寄存器來訪問,即使根據(jù)實(shí)際位置并不需要這么做。group將所有屬于組內(nèi)的代碼和數(shù)據(jù)在邏輯上按屬于同一段的方式來訪問,這個(gè)段的段地址就是group的首地址。
二、Group的優(yōu)點(diǎn)
??這樣做的好處是cpu在代碼跳轉(zhuǎn)或數(shù)據(jù)訪問時(shí),段寄存器不用變更(都參照group的起始地址),減少跨段訪問操作,加快程序的執(zhí)行速度。
三、Group知識(shí)擴(kuò)展
??Mams5后對段的定義即劃分進(jìn)行了簡化,并給出了標(biāo)準(zhǔn)化建議。如按照標(biāo)準(zhǔn)化定義段,還可以與c、basic、pascal等高級(jí)語言進(jìn)行相互調(diào)用。
??.model tiny/small/medium/compat/large/huge(6種內(nèi)存模型)
??tiny,代碼和數(shù)據(jù)在一個(gè)段中,整個(gè)程序只有一個(gè)段。
??small,代碼只有一個(gè)段,數(shù)據(jù)只有一個(gè)段。
??medium,數(shù)據(jù)只有一個(gè)段,代碼可存在多個(gè)段。
??compat,代碼只有一個(gè)段,數(shù)據(jù)可存在多個(gè)段。
??large,代碼和數(shù)據(jù)都可以有多個(gè)段。
??huge,代碼和數(shù)據(jù)都可以有多個(gè)段,且data array可以超過64K。
??
??.model指令還自動(dòng)定義group和assume指令,將相應(yīng)的段加入group,并將段寄存器與group關(guān)聯(lián),如.model small,就會(huì)自動(dòng)生成
dgroup group _data,const,_bss,stack
assume ds:dgroup。
??但注意,這里需要手動(dòng)為ds賦值:
mov ax,dgroup
mov ds,ax

浙公網(wǎng)安備 33010602011771號(hào)