1. 程式人生 > >組合語言程式設計 實驗五

組合語言程式設計 實驗五

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

pic1

  • 使用r命令觀察,發現DS=075A,所以程式從076A:0開始存放。

    pic2

  • 以下即為程式返回前data的值。

pic3

  • 用u反彙編,data段的段地址為x-2,stack段的段地址為x-1。再用g命令回到上一步,得到程式返回前cs,ss,ds的值。

    pic4

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

pica

  • 程式返回前data的資料:

picb

  • 看到cs,ss,ds值:

    picc

    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

picccccc

data段的段地址為x+3,stack段的段地址為x+4。

  • 只有3可正確執行,因為去掉start後就不指明程式入口,程式從頭開始執行,而1,2,是以資料段開頭,只有3是命令段,能正確執行下去。

t

編譯連線後觀察ss後8位元組

picfinal

總結:要注意程式入口