實驗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 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段中的數據為多少?
答: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中的數據逆序存
總結:對內存的分配有了更深刻的了解。
實驗5 編寫調試有多個段的程序