1. 程式人生 > >《組合語言》實驗五課程

《組合語言》實驗五課程

 

實驗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

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。

 

實驗2

將下面的程式編譯、連線,用Debug載入、跟蹤,然後回答問題。

 

(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/16+1)*16。

 

實驗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段中的資料為多少?

答: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”(也就是說,不知名程式的入口),則哪個程式仍然可以正確執行?請說明原因

 

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
s1:    mov al,ds:[bx]
         mov es:[bx],al
         inc bx
         loop s1
         mov ax,b
         mov ds,ax
         mov bx,0
         mov cx,8
s2:     mov al,ds:[bx]
          add es:[bx],al
          inc bx
          loop s2

          mov ax,4c00h
          int 21h

code ends

end start

實驗一

實驗二

 

 

 實驗三

 

 

經過比較發現:實驗1、2不能正確執行,實驗3仍然可以正確執行。

原因:end start變成end,說明不指明程式入口,程式預設從IP=0處執行;實驗3是程式碼段在前,而實驗1、2是程式碼段在後,說明實驗3中IP=0時就可以執行程式碼段的內容。所以實驗3仍可以正確執行。

 

 實驗5

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
s1:    mov al,ds:[bx]
         mov es:[bx],al
         inc bx
         loop s1
         mov ax,b
         mov ds,ax
         mov bx,0
         mov cx,8
s2:     mov al,ds:[bx]
          add es:[bx],al
          inc bx
          loop s2

          mov ax,4c00h
          int 21h

code ends

end start

 

① 在實現資料相加前,邏輯段 c 的 8 個位元組:00 00 00 00 00 00 00 00

② 執行完實現加運算的程式碼後,邏輯段 c 的 8 個位元組:02 04 06 08 0A 0C 0E 10

3.根據①和②的除錯,實驗程式正確實現資料相加

 

實驗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,a
         mov ds,ax
         mov ax,b   
         mov bx,0
         mov ss,ax
         mov sp,16
         mov cx,8
s:      push [bx]
         add bx,2
          loop s 
    
         mov ax,4c00h
         int 21h
code ends

end start