1. 程式人生 > >組合語言 實驗5

組合語言 實驗5

實驗5

實驗任務1:編寫、執行書中含有多個段的程式,觀察實驗結果,完成填空

(1)

 

(2)

 

(3)(4)

 

簡要除錯過程:

 

 

tips:

程式返回後有許多附屬的程式碼段

 

實驗任務2:編寫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

c0 segment ; 在整合軟體環境中,請將此處的段名稱由c→改為c1或其它名稱
db 8 dup(0)
c0 ends ; 改的時候要成對一起修改

code segment
start:
;修改(不能用棧,因為入棧出棧都是以字資料為一個單元來完成的,而這裡是位元組型資料)
mov ax,a
mov ds,ax

mov bx,0
mov cx,8h

to:mov ah,0
mov al,[bx]
mov dx,b
mov es,dx
add al,es:[bx]
mov dx,c0
mov es,dx
mov es:[bx],al
add bx,1
loop to
;修改
mov ax,4c00h
int 21h
code ends
end start

 進入debug環境,用反彙編檢視程式碼:

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

 

除錯過程:

 

 

實驗任務3:編寫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 8 dup(0)
b ends

code segment
start:
;修改
mov ax,a
mov ds,ax

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

mov bx,0
mov cx,8h

s0:push [bx]
add bx,2h
loop s0

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

進入debug環境後,用反彙編檢視程式碼:

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

 

除錯過程:

 

 

 

 

實驗5——總結

收穫:通過這次實驗,我懂得了怎麼將各個暫存器分段進行儲存(也可以在cs段前面定義資料,但是這樣沒有用分段這麼簡潔明瞭),知道了分段儲存時段與段之間的相對位置關係,明白了標號和程式入口的重要性,學會了利用棧段做各種資料儲存的操作。

 

問題:分段儲存時,為什麼段與段之間的相對位置不會發生改變呢?這樣的相對位置是如何得到的呢?