實驗5 編寫除錯有多個段的程式
實驗1
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 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段中的資料為多少?
答:23 01 56 04 89 07 BC 0A EF 0D ED 0F BA 0C 87 09
(2)CPU執行程式,程式返回前,cs=076C、ss=076B、ds=076A。
(3)設程式載入後,code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1。
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)CPU執行程式,程式返回前,data段中的資料為多少?
答:23 01 56 04 00 00 00 00 00 00 00 00 00 00 00 00
(2)CPU執行程式,程式返回前,cs=076C,ss=076B,ds=076A。
(3)設程式載入後,code段的段地址為X,則data段的段地址為X-2,stack段的段地址為X-1。
(4) 對於如下定義的段:
name segment
......
name ends
如果段中的資料佔N個位元組則程式載入後,該段實際佔有的空間為((N+15)/16)*16)
實驗三
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段中的資料為多少?
答:23 01 56 04 00 00 00 00 00 00 00 00 00 00 00 00
(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)
只有實驗三可以正確執行。原因在於不指明程式入口,程式預設從IP=0處執行;實驗3是程式碼段在前,而實驗1、2是程式碼段在後。所以實驗3仍可以正確執行。
實驗5
① 在實現資料相加前,邏輯段 c 的 8 個位元組:00 00 00 00 00 00 00 00
② 執行完實現加運算的程式碼後,邏輯段 c 的 8 個位元組:02 04 06 08 0A 0C 0E 10
實驗6
b中的資料逆序存
總結:對記憶體的分配有了更深刻的瞭解。