實驗5 編寫、調試具有多個段的程序
1.將下面的程序編譯、連接、用Debug加載、跟蹤,然後回答問題。
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 stack ends code segment start: mov ax,stack mov ss,ax mov sp,16 mov ax,data mov ds,ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start
(1)CPU執行程序,程序返回前,data段中的數據為0123h
(2)CPU執行程序,程序返回前,CS=076c、SS=076b、DS=076a。
(3)設程序段加載後,code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1。
2.將下面的程序編譯、連接,用debug加載、跟蹤,然後回答問題。
assume cs:code,ds:data,ss:stack data segment dw 0123h,0456h data ends stack segment dw0,0 stack ends code segment start: mov ax,stack mov ss,ax mov sp,16 mov ax,data mov ds,ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends end start
(1)CPU執行程序,程序返回前data段中的數據為0123h
(2)CPU執行程序,程序返回前,CS=076c、SS=076b、DS=076a。
(3)設程序加載後,code段的段地址為X,則data段中的段地址為X-2,stack段的段地址為X-1。
(4)對於如下定義的段:
name segment
...
name ends
如果段中的數據占N個字節,則程序加載後,該段實際占有的空間為
3.將下面的程序編譯、連接,用debug加載、跟蹤,然後回答問題。
assume cs:code,ds:data,ss:stack code segment start: mov ax,stack mov ss,ax mov sp,16 mov ax,data mov ds,ax push ds:[0] push ds:[2] pop ds:[2] pop ds:[0] mov ax,4c00h int 21h code ends data segment dw 0123h,0456h data ends stack segment dw 0,0 stack ends end start
(1)CPU執行程序,程序返回前,data段中的數據為0123h
(2)CPU執行程序,程序返回前,CS=076a、SS=076e、DS=076d
(3)設程序加載後,code段的段地址為X,則data段中的段地址為X+3,stack段的段地址為X+4。
4.如果將1、2、3題中的最後一條偽指令“end start”改為“end”(也就是說,不指明程序的入口),則哪個程序仍然可以正確執行?請說明原因。
雖然實驗1、2都能通過匯編、連接、運行,但是反匯編後出現了令人看不懂的指令
實驗3可以正確執行
從表面上看,3個實驗的差異是實驗3將代碼段寫在數據段和棧段之後
(5)程序如下,編寫code段中的代碼,將a段和b段中的數據依次相加,將結果存放到c段中。
assume cs:code a segment db 1,2,3,4,5,6,7,8 a ends b segment db 1,2,3,4,5,6,7,8 b ends c segment db 0,0,0,0,0,0,0,0 c ends code segmentstart: mov ax,a
mov ds,ax
mov ax,c
mov es,ax
mov bx,0
mov cx,8 s: mov al,ds:[bx]
mov es:[bx],al
inc bx
loop s mov ax,b
mov ds,ax
mov bx,0
mov cx,8 s0: mov al,ds:[bx]
add ex:[bx],al
inc bx
loop s0
code ends end start
(6)程序如下,編寫code段中的代碼,用push指令將a段中的前8個字型數據,逆序存儲到b段中。
assume cs:code a segment dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh a ends b segment dw 0,0,0,0,0,0,0,0 b ends code segment start: mov ax,b mov ss,ax mov sp,10h mov ax,a mov ds,ax mov bx,0 mov cx,8 s: push [bx] add bx,2 loop s
mov ax,4c00h int 21h code ends end start
push操作執行前
push操作執行後
總結與體會
完成實驗5時,老師給出了分階段使用ds的方法,感覺這是這次實驗最大的收獲。
實驗5 編寫、調試具有多個段的程序