組合語言程式設計 實驗五
阿新 • • 發佈:2018-11-26
1.將ex5_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
使用r命令觀察,發現DS=075A,所以程式從076A:0開始存放。
以下即為程式返回前data的值。
用u反彙編,data段的段地址為x-2,stack段的段地址為x-1。再用g命令回到上一步,得到程式返回前cs,ss,ds的值。
2.將ex5_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
- 程式返回前data的資料:
看到cs,ss,ds值:
data段的段地址為x-2,stack段的段地址為x-1。
**實際佔用的空間為(N/16+1)*16。**
3.將ex5_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
data段的段地址為x+3,stack段的段地址為x+4。
- 只有3可正確執行,因為去掉start後就不指明程式入口,程式從頭開始執行,而1,2,是以資料段開頭,只有3是命令段,能正確執行下去。
編譯連線後觀察ss後8位元組
總結:要注意程式入口