多個代碼段的程序
這種思想即: 將程序分為代碼段,數(shù)據(jù)段,棧段
為規(guī)范內(nèi)存的使用,程序員是不能隨便決定內(nèi)存空間的使用,應(yīng)該讓系統(tǒng)進(jìn)行分配例如 數(shù)據(jù)段的并且連接的程序段.
數(shù)據(jù)段指令dw(define word):
? ? ? ?dw 1020h,2123h,0f212h ?//定義字?jǐn)?shù)據(jù) 若是在程序開頭定義,則其偏移地址分別為0 2 4. ?按照字符編址的.
//傳輸數(shù)據(jù)的寬度,則是能找到字符數(shù)據(jù)的地址位數(shù).即可尋址范圍
要注意: ?定義的字?jǐn)?shù)據(jù)段的數(shù)據(jù)長度和偏移地址的關(guān)系. 偏移地址以字符為單位編址,就先把定義的數(shù)據(jù)段計算出占多少字符.再加上當(dāng)前偏移地址,并用16進(jìn)制進(jìn)行表示.
同時,定義了這些數(shù)據(jù),也等價于申請了一定的內(nèi)存空間.
通過end 標(biāo)記//來指明代碼段執(zhí)行的入口
將棧段,數(shù)據(jù)段,代碼段分別處理
assume cs:code,ds:data,ss:stack ?//這一句只是提醒編譯器,而無任何實質(zhì)性作用
data segment
dw 0123h , 0223h , 0323h , 0254h ,0fff2h
data ends
stack segment
dw 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
stack ends
code segment
start: ? ?mov ax,stack ? //stack段 地址 ? ?
? ? ? ? ? ? mov ss,ax ? ? ? ?//設(shè)置棧段寄存器
? ? ? ? ? ? mov sp,1Ch ? ? //設(shè)置棧偏移地址(最大地址,棧底)
? ? ? ? ? ? mov ax,data ? ? //data段 ?地址 ?
? ? ? ? ? ? mov ds,ax ? ? ? //設(shè)置數(shù)據(jù)段的段寄存器
? ? ? ? ? ? mov bx,0
? ? ? ? ? ? mov ?cx,8
? ? ? ? ? ?s: ?push ?[bx]
? ? ? ? ? ? ? ? add bx,2
? ? ? ? ? ?loop ?s
? ? ? ? ? ? ?mov ?ax,4c00h
? ? ? ? ? ? ?int 21h
code ends
end start
這段程序中据悔,stack ,data , code ,start均為可變的名稱。assume 只是關(guān)聯(lián)了寄存器和段名并未讓寄存器真正的賦值耘沼。cpu會根據(jù)end start 中start的標(biāo)志來明確cs:ip的執(zhí)行接口极颓。分開段寫目前有兩個優(yōu)點:1,有標(biāo)志代表stack,data的入口地址群嗤。 2菠隆,容易區(qū)分
但是在過程中,其在內(nèi)存中的分布依然是連續(xù)的狂秘。內(nèi)存的分配和段的位置是相關(guān)的骇径。
匯編中不能使用//進(jìn)行注釋