1. 程式人生 > >匯編語言——包含多個段的程序

匯編語言——包含多個段的程序

在一起 程序 assume 循環 逆序 class tac 都在 棧頂指針

多個段在一起

問題:利用棧,將程序中定義的數據段數據逆序存放。

 1 assume cs:codesg    ; 定義代碼段的位置(codesg的值就是cs寄存器的值)
 2 codesg segment
 3     dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
 4     ; dw(define word)的含義是定義字型數據,db->定義字節型數據
 5     ; 由於我們是在代碼段定義的這些數據,所以這些數據是在代碼段的(即(cs)=(ds))
 6     dw 0,0,0,0,0,0,0,0      ; 用dw定義了一個棧段
 7 start:
mov ax,cs 8 mov sp,32 ; 棧段+數據段一共16個字(占內存空間0~31),棧底=最高位+1 9 mov cx,8 10 s: push cs:[bx] 11 add bx,2 12 loop s 13 14 mov bx,0 15 mov cx,8 16 s0:pop cs:[bx] 17 add bx,2 18 loop s0 19 mov ax,4c00h 20 int 21h
21 codesg ends 22 end start ; start的作用:1.決定代碼的開始位置,2.程序結束

由於是在代碼段定義的數據和棧所以他們都在一起會顯得很亂。不信你看下面的題就知道了

技術分享圖片

技術分享圖片

將數據、代碼、棧放入不同的段

將各個段全部放在一起主要有兩個問題:
(1)把它們放到一個段中使程序顯得混亂;
(2)前面程序中處理的數據很少,用到的棧空間也小,加上沒有多長的代碼,放到一個段裏面沒有問題。

所以我們要將他們放進不同的段

我也不知道我寫的是啥,反正有用。

 1 assume cs:code,ds:data,ss:stack      ; 定義代碼段,數據段,棧段
 2 data segment 
3 dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h,後面8個0 4 data ends ; 數據段結束 5 6 stack segment 7 dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; 16個字 8 stack ends ; 棧段結束 9 10 code segment 11 start: mov ax,stack ; 將CPU分配給棧段的地址賦值給ax寄存器 12 mov ss,ax ; 然後在賦值給ss棧段寄存器 13 mov sp,20h ; 將棧頂指針設置在32的位置 14 15 mov ax,data 16 mov ds,ax ; ds指向data段 17 mov bx,0 ; 將ds[bx]指向data段的第一個單元 18 19 mov cx,8 ; 循環8次 20 s :push [bx] ; 將數據段的第0個值push進棧段 21 add bx,2 ; 因為一個字2字節 22 loop s ; 將data段的8個字,依次入棧 23 24 mov cx,8 25 s0:pop [bx] ; 此時(bx)=16,將棧中數據pop出放進數據段內存單元=16中 26 add bx,2 27 loop s0 ; 出棧8個字,依次放進16~31內存單元中 28 29 mov ax,4c00H 30 int 21H 31 32 code ends ; 代碼段結束 33 end start

匯編語言——包含多個段的程序