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


多個段在一起

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

 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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM