包含多個段的程式 課後實驗
(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
①CPU執行程式,程式返回前,data段中的資料 。
②CPU執行程式,程式返回前,CS= ,SS= ,DS= 。
③設程式載入後,CODE段的段地址為X,則DATA段的段地址為 ,STACK段的段地址為 。
實驗:1、輸入程式碼
2、編譯、連線
用 u命令進行反彙編,並用 g 命令執行到 076c:001d
因為問 data段中資料,所以用 d命令查詢 得:data段中的資料不變;
CPU執行程式,程式返回前,cs=076c,ss076b,ds=076a;
設程式載入後,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
dw 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、編碼
2、編譯、連線
用 u命令進行反編譯;
繼續用 d命令查詢
所以,CPU執行程式,程式返回前,data段中的資料不變;
CPU執行程式,程式返回前,cs=076c,ss076b,ds=076a;
設程式載入後,code段的段地址為x,則data段的段地址為x-2,stack段的段地址為x-1;
對於如下定義的段:
name segment
……
name ends
如果段中的資料佔N個位元組,則程式載入後,該段實際佔有的空間為 ((N/16+1)*16 。(N一般為16的倍數,如果不是16的倍數,則加一,再×16。若為16的倍數,則直接為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、編碼
2、編譯、連線
用u進行反彙編
再用 g命令,直接執行到 076a:001d
在用 d命令查詢 ds
由圖可知:(其實根據前面的幾個實驗可以發現)
data段中的資料不變;
cs=076a,ss=076e,ds=076d;
設程式載入後,code段的段地址為x,則data段的段地址為x+3,stack的段地址為x+4;
(4)如果將(1)、(2)、(3)題中的最後一條偽指令“end start”改為“end”(也就是說,不指明程式的入口),則哪個程式仍然可以正確執行?請說明原因。
答: 只有(3)可以執行,因為“end start”改為“end”,則程式不能識別 start,會從程式開頭,資料段和棧段開始執行,不是從程式程式碼開始,資料段和棧段所代表的程式碼則是亂碼;
(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 ; 在整合軟體環境中,請將此處的段名稱由c→改為c1或其它名稱
db 8 dup(0)
c ends ; 改的時候要成對一起修改
code segment
start:
;?
code ends
end start
程式碼編寫:
在進行 編譯、連線
進行 反彙編
查詢 a,b,c 的初始資料,在執行
(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 8 dup(0)
b ends
code segment
start:
;?
code ends
end start
程式碼編寫:
編譯。連線
用u進行反彙編,並執行