多個段在一起
問題:利用棧,將程序中定義的數據段數據逆序存放。
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