組合語言筆記06 包含多個段的程式

2022-07-24 11:06:15 字數 3304 閱讀 8571

在作業系統的環境下,合法地通過作業系統取得的空間都是安全的。程式取得所需空間的方法有兩種:一是在引導程式的時候為程式分配,再就程式在執行過程中向系統申請。

對於第一種方式,我們在程式中定義將要處理的資料,這些資料被編譯、連線程式作為程式的一部分寫入可執行檔案中。當可執行檔案的程式載入到記憶體中,這些資料也同時被載入到記憶體中。

在**段中使用資料

例:計算以下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 ...