在作業系統的環境下,合法地通過作業系統取得的空間都是安全的。程式取得所需空間的方法有兩種:一是在引導程式的時候為程式分配,再就程式在執行過程中向系統申請。
對於第一種方式,我們在程式中定義將要處理的資料,這些資料被編譯、連線程式作為程式的一部分寫入可執行檔案中。當可執行檔案的程式載入到記憶體中,這些資料也同時被載入到記憶體中。
在**段中使用資料
例:計算以下8個資料的和,結果存在ax暫存器中:
0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
1 assume cs:code23
code segment45
dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h67
start:
mov bx, 0
8mov ax, 0910
mov cx, 8
11s:
add ax, cs:
[bx]
12add bx, 2
13loop s
1415
movax, 4c00h
16int
21h17
18code ends
19 end start ;
通知編譯器程式的入口,最終cs:ip指向該入口位址
debug分析:c:\codes>debug p6_2.exe
-rax=
0000 bx=0000 cx=0026 dx=0000 sp=0000 bp=0000 si=0000 di=0000
ds=0bda es=0bda ss=0bea cs=0bea ip=0010
nv up ei pl nz na po nc
0bea:0010 bb0000 mov bx,0000
-u0bea:0010 bb0000 mov bx,0000
0bea:0013 b80000 mov ax,0000
0bea:0016 b90800 mov cx,0008
0bea:0019 2e cs:
0bea:001a
0307
addax,[bx]
0bea:001c 83c302 add bx,+02
0bea:001f e2f8 loop 0019
0bea:0021 b8004c mov
ax,4c00
0bea:0024 cd21 int
21ds=
0bda->cs=0bea debug載入後,因為開頭是資料(16bytes),end指定了start,所以將ip設定為10h,從而指向cs:ip的第一條指令。
在**段中使用棧
例:使用棧將程式中定義的資料逆序存放。
1 assume cs:code23
code segment45
dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
6 dw 0, 0, 0, 0, 0, 0, 0, 07;
用dw定義16個字型資料,在程式載入後,將取得16個字的記憶體空間,8;
存放這16個資料。程式中將這段空間當做棧使用。910
start:
movax, cs
11mov
ss, ax
12mov sp, 20h ;
設定棧頂ss:sp指向 cs:20
1314
mov bx, 0
15mov cx, 8
16s:
push
cs:[bx]
17add bx, 2
18 loop s ;
將0~15記憶體單元依次入棧
1920
mov bx, 0
21mov cx, 8
22s0:
popcs:
[bx]
23add bx, 2
24 loop s0 ;
出棧25
26mov
ax, 4c00h
27int
21h28
29code ends
30 end start
將資料、**、棧放入不同的段
將資料、棧和**放到乙個段裡面,顯得非常混亂;其次,由於8086的段最大為64kb, 如果將資料、棧都放在**中,擠占了**段的空間。
例:使用棧將程式中定義的資料逆序存放。
1 assume cs:code, ds:data, ss:stack23
data segment
4dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
5data ends67
stack segment
8 dw 0, 0, 0, 0, 0, 0, 0, 0
9stack ends
1011
code segment
12start:
movax, stack
13mov
ss, ax
14mov sp, 10h ;
設定棧頂ss:sp指向stack:10
1516
movax, data
17mov
ds, ax
18mov bx, 0
;設定ds:bx指向資料段的第乙個單元
1920
mov cx, 8
21s:
push
[bx]
22add bx, 2
23 loop s ;
入棧24
25mov bx, 0
26mov cx, 8
27s0:
pop[bx]
28add bx, 2
29 loop s0 ;
出棧30
31mov
ax, 4c00h
32int
21h33
34code ends
3536 end start
注意:
彙編06 包含多個段的程式
在執行匯程式設計序的時候,不要隨便向某個暫存器中賦值,這可能會導致系統錯誤,雖然現在的作業系統已經完全把硬體保護起來了,但是在安全模式下還是可以執行導致系統崩潰的命令。所以我們在編寫匯程式設計序的時候,要找到一段安全的空間供我們使用,在一般的pc機中,dos方式下,dos和其他合法的程式一般都不會使...
組合語言學習筆記(六)包含多個段的程式
6.1在 段中使用資料 dw 定義字型資料 define word db 定義位元組資料 define byte assume cs codesg code segment dw 0123h,0456h 偏移位址從0 2 4 6.start mov bx,0 mov ax,0 mov cx,8 s ...
組合語言讀書筆記(6 包含多個段的程式)
組合語言 第三版,王爽 讀書筆記 dw 即 define word 定義字型資料,存放在 段中 cs 示例程式 assume cs code code segment dw 0123h,0456h,0789h,0abch,0defh,ofedh,0cbah,0987h start mov bx,0 ...