1. 程式人生 > >包含多個段的程式 課後實驗

包含多個段的程式 課後實驗

(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進行反彙編,並執行