6.0 概述
前面的程式中,只有乙個**段,如果程式需要其他空間來存放資料,使用**呢?
第5章講過,0:200~0:2ff是相對安全的記憶體空間,但大小只有256個位元組,如果我們需要的空間超過256個位元組,就需要向系統申請。
程式取得所需要的空間的方法有兩種,一是在載入時分配,二是執行過程中向系統申請,本課程不討論第二種方法。
我們若要在乙個程式被載入時取得所需空間,必須要在源程式中作出說明,我們通過在源程式中定義段來進行記憶體空間的獲取。
6.1 在**段中使用資料
示例程式:
assume cs:code
code segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
mov bx,0
mov ax,0
mov cx,8
s:add ax,cs:[bx]
add bx,2
loop s
mov ax,4c00h
int 21
code ends
end注:其中,dw是"define word"的縮寫,即定義字型資料。
該程式中定義的資料處於**段中,位址為cs:0,cs:2,cs:4,cs:6,cs:8,cs:a,cs:c,cs:e。
程式編譯鏈結後無法正常執行,因為**段的入口是資料,不是指令。可以用end偽指令來指明程式入口。
assume cs:code
code segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
start:mov bx,0
mov ax,0
mov cx,8
s:add ax,cs:[bx]
add bx,2
loop s
mov ax,4c00h
int 21
code ends
end start
>>>>乙個可執行檔案由描述資訊和程式組成,程式來自於源程式中的彙編指令和定義的資料;描述資訊則主要是編譯、連線程式對源程式中相關偽指令進行處理得到的資訊<<<<
6.2 在**段中使用棧
示例程式:
assume cs:code
code segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
start: mov ax,cs
mov ss,ax
mov sp,30
mov bx,0
mov cx,8
s: push cs:[bx]
add bx,2
loop s
mov bx,0
mov cx,8
s0: pop cs:[bx]
add bx,2
loop s0
mov ax,4c00h
int 21h
code ends
end start
6.3 將資料、**、棧放入不同的段
(1) 定義多個段的方法
與定義**段的方法沒有區別,只是不同的段要有不同的段名。
(2) 對段位址的引用
在程式中,段名就相當於乙個標號,它代表了段位址。
(3) 資料段、**段、棧段,完全是我們自己的安排
實驗5 編寫、排程具有多個段的程式
略
組合語言 筆記 包含多個段的程式
問題 程式設計計算以下8個資料的和,結果存在ax暫存器中 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h assume cs code code segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,...
組合語言之包含多個段的程式
一 段和資料段同時存在 首先我們編寫乙個程式,將0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h累加並存放在ax中。assume cs code code segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0c...
組合語言讀書筆記(6 包含多個段的程式)
組合語言 第三版,王爽 讀書筆記 dw 即 define word 定義字型資料,存放在 段中 cs 示例程式 assume cs code code segment dw 0123h,0456h,0789h,0abch,0defh,ofedh,0cbah,0987h start mov bx,0 ...