1. 程式人生 > >組合語言_實驗五_編寫、除錯具有多個段的程式

組合語言_實驗五_編寫、除錯具有多個段的程式

四、實驗結論

 

(1)

①data段中資料為 23 01 56 04 89 07 bc 0a ef 0d ed 0f ba 0c 87 09

②cs=076C、ss=076B、ds=076A

③X-2,X-1

(2)

①data段中資料為 23 01 56 04 00 00 00 00 00 00 00 00 00 00 00 00

②cs=076C、ss=076B、ds=076A

③X-2,X-1

④ (此處括號意為向上取整)

(3)

①data段中資料為 23 01 56 04 00 00 00 00 00 00 00 00 00 00 00 00

②cs=076A、ss=076E、ds=076D

③X+3,X+4

(4)

程式(3)可以正確執行,因為如果不使用start,程式將以第一個段作為入口,而在前兩個程式中,該處存放的是資料而非我們想要執行的彙編指令。

(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

c1 segment  

  db 8 dup(0)

c1 ends         

code segment

start:

         mov ax,a

         mov ds,ax

         mov bx,0

         mov ax,c1

         mov es,ax

         mov cx,8

              s:mov ax,0

         add al,[bx]

         add al,[bx+10H]

         mov es:[bx],ax

         add bl,1

         loop s

         mov ax,4c00h

         int 21h

code ends

end start

①     實現資料相加前,資料段C1中前八個位元組如圖所示:

 

②     執行完實現加運算的程式碼後,邏輯段C1中的8個位元組如圖所示:

 

 經驗證發現,該程式碼確實實現了資料段a,b中資料相加。

(6)

原始碼如下:

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 ss,ax

         mov sp,10h

         mov cx,8

         mov bx,0

         s:push [bx]

         add bx,2

         loop s

         mov ax,4c00h

         int 21h

code ends

end start

①     在push操作執行前,檢視邏輯段b的8個字單元資訊:

 

②      執行 push操作,然後再次檢視邏輯段b的8個字單元資訊:

 

經驗證,此時資料段b中的前八個字資料恰好是資料段a中的前八個字資料逆序存放。

 

五、總結與體會

 

通過本次實驗,瞭解了包含多個段的程式各段載入後在記憶體中各自分配的容量以及彼此間的相對位置,進一步掌握了使用暫存器間接定址,熟悉了loop命令的使用。