組合語言之包含多個段的程式

2021-08-20 12:17:22 字數 2879 閱讀 5674

(一)**段和資料段同時存在

首先我們編寫乙個程式,將0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h累加並存放在ax中。

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 21h

code ends

end start

在有多個段存在時,可以用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 21h

code ends

end start

上述可以看出在存在資料段和**段時,利用end表明程式的入口位置。

因此我們可以通過上述的例子了解到,當程式中存在資料和**時,我們採用以下的架構完成:

assume cs:code

code segment

……

資料

……start:

……

**……

code ends

end start

(二)在**段中使用棧

例子:利用棧,將程式定義的資料逆序存放。

assume cs:codesg

codesg segment

dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

?codesg ends

end那麼我們如何完成程式?

先將定義的資料存放在cs:0-cs:f單元中,一共有8個字單元,將這8個字單元中的內容入棧,在依次出棧可以實現逆序存放。

**:assume cs:codesg

codesg 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 //定義16個字形資料,將這段空間當做棧

start: mov ax,cs

mov ss,ax

mov sp,30h

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

codesg ends

end start

(三)將資料,**,棧放入不同的段

根據上述的兩個例子,我們了解了如何將資料,**,棧放入**中,但是若是按照上述的方法程式設計,會造成兩個問題:

(1)顯得程式混亂

(2)之前的例子中資料量少,但是一旦資料量很大時,所用到大的棧的空間也會很大,所有一旦把所有的資料,**和棧放入乙個段中可能會超過乙個段的容量(64kb)

因此,將資料,**,棧放入不同的段中:

assume cs:code,ds:data,ss:stack

data segment

dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h

data ends

stack segment

dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

stack ends

code segment

start:   mov ax,stack

mov ss,ax

mov sp,20h

mov ax,data

mov ds,ax

mov bx,0

mov cx,8

s:  push [bx]

add bx,2

loop s

s0: pop [bx]

add bx,2

loop s0

mov ax,4c00h

int 21h

code ends

end start

注意:mov ax,data

mov ds,ax

mov bx,ds:[6]

不可以替換成:

mov ds,data

mov bx,ds:[6]

原因:8086cpu不允許將乙個數值送入段暫存器,程式中對段名的引用,如「mov ds,data

」中的「data」將被編譯器處理為乙個段位址的數值。

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

問題 程式設計計算以下8個資料的和,結果存在ax暫存器中 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h assume cs code code segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,...

組合語言 多個段的程式

下面 展示了多段程式,功能是將data中的資料,翻轉儲存 assume cs code,ds data,ss stack data segment dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h data ends stack segment d...

筆記 組合語言 第6章 包含多個段的程式

6.0 概述 前面的程式中,只有乙個 段,如果程式需要其他空間來存放資料,使用 呢?第5章講過,0 200 0 2ff是相對安全的記憶體空間,但大小只有256個位元組,如果我們需要的空間超過256個位元組,就需要向系統申請。程式取得所需要的空間的方法有兩種,一是在載入時分配,二是執行過程中向系統申請...