1. 程式人生 > >實驗5 編寫、調試具有多個段的程序

實驗5 編寫、調試具有多個段的程序

end 存儲 segment 連接 總結 操作 bug enter str

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

技術分享圖片

(1)CPU執行程序,程序返回前,data段中的數據為0123h

(2)CPU執行程序,程序返回前,CS=076c、SS=076b、DS=076a。

(3)設程序段加載後,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)CPU執行程序,程序返回前data段中的數據為0123h

(2)CPU執行程序,程序返回前,CS=076c、SS=076b、DS=076a。

(3)設程序加載後,code段的段地址為X,則data段中的段地址為X-2,stack段的段地址為X-1。

(4)對於如下定義的段:

name segment

...

name ends

如果段中的數據占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)CPU執行程序,程序返回前,data段中的數據為0123h

(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可以正確執行

從表面上看,3個實驗的差異是實驗3將代碼段寫在數據段和棧段之後

(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

      db 0,0,0,0,0,0,0,0

c ends

code segment
start: mov ax,a
mov ds,ax
mov ax,c
mov es,ax
mov bx,0
mov cx,8

     s:   mov al,ds:[bx]
mov es:[bx],al
inc bx
loop s

          mov ax,b
mov ds,ax
mov bx,0
mov cx,8

    s0:    mov al,ds:[bx]
add ex:[bx],al
inc bx
loop s0

code ends end start

(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 0,0,0,0,0,0,0,0

b ends

code segment

start:  mov ax,b
          mov ss,ax
          mov sp,10h

          mov ax,a
          mov ds,ax
          mov bx,0
          mov cx,8

    s:   push [bx]
          add bx,2
          loop s

mov ax,4c00h int 21h code ends end start

技術分享圖片

push操作執行前

技術分享圖片

push操作執行後

總結與體會

完成實驗5時,老師給出了分階段使用ds的方法,感覺這是這次實驗最大的收獲。

實驗5 編寫、調試具有多個段的程序