1. 程式人生 > 實用技巧 >組合語言實驗2

組合語言實驗2

一、實驗目的
1. 理解並掌握彙編源程式組成與結構
2. 掌握組合語言源程式編寫→彙編→連結→除錯的工具和方法
3. 理解彙編源程式中地址表示、段暫存器的用法
4. 理解和掌握暫存器間接定址方式[bx]
5. 通過彙編指令loop的使用理解程式語言中迴圈的本質

二、實驗準備
1. 學習/複習第5章使用[bx]和loop實現迴圈的程式設計應用示例(教材5.5節,5.8節)
2. 複習第3章「棧」的知識
3. 結合第4章課件,複習完整彙編源程式編寫→彙編→連線→執行→除錯的方法
4. 複習8086彙編中記憶體單元地址的表示,以及段暫存器DS, SS, ES, CS的用途

三、實驗內容

1. 實驗任務1 使用任意一款文字編輯器,編寫8086彙編源程式ex1.asm。原始碼如下:

 1 ;ex1.asm
 2 assume cs:code
 3 code segment
 4 mov ax, 0b810h
 5 mov ds, ax
 6 mov byte ptr ds:[0], 1
 7 mov byte ptr ds:[1], 1
 8 mov byte ptr ds:[2], 2
 9 mov byte ptr ds:[3], 2
10 mov byte ptr ds:[4], 3
11 mov byte ptr ds:[5], 3
12 mov byte ptr ds:[6], 4
13 mov byte ptr ds:[7], 4
14 mov ah, 4ch
15
int 21h 16 code ends 17 end

要求:使用8086彙編程式編寫、彙編、連結、執行、除錯方法,對ex1.asm進行彙編、連結、執行,使用debug工具除錯可執行檔案。

  • 使用masm、link對ex1.asm進行彙編、連結,得到可執行檔案ex1.exe,執行並觀察結果

  • 使用debug工具對程式進行除錯

使用debug載入可執行檔案ex1.exe後,使用d命令檢視程式段字首PSP所佔的256個位元組。

結合可執行檔案中暫存器CX的值,使用u命令對ex1.exe進行精確反彙編
使用g命令執行到程式退出執行之前(即原始碼檔案中line16之前),觀察結果

2. 實驗任務2
使用任意一款文字編輯器,編寫8086彙編源程式ex2.asm。原始碼如下:

; ex2.asm
assume cs:code
code segment
mov ax, 0b810h
mov ds, ax
mov bx, 0
mov ax, 101H
mov cx, 4
s: mov [bx], ax
add bx, 2
add ax, 101H
loop smov ah, 4chint 21hcode endsend

要求:使用8086彙編程式編寫、彙編、連結、執行、除錯方法,對ex2.asm進行彙編、連結、執行,用debug工具除錯可執行檔案。

  • 使用masm、link對ex2.asm進行彙編、連結,得到可執行檔案ex2.exe,執行並觀察結果

  • 使用debug工具對程式進行除錯。

結合可執行檔案中暫存器CX的值,使用u命令對ex2.exe進行精確反彙編。

靈活使用t命令、p命令、g命令,對ex2.exe進行除錯。(不一定要單步,有些地方可以用g命令,一次執行多行彙編指令)。

R命令

t命令

p命令

g命令

把ex2.asm中line9 mov cx, 4 改成 mov cx, 8 ,儲存後重新彙編、連結、執行並觀察結果。

結合上述實驗和觀察,分析、對比ex2.asm和ex1.asm,它們實現的是否是相同的功能和效果?在具體實現上有什麼不同?

它們的功能效果都是向視訊記憶體中寫入資料,但是他們的迴圈次數cx不同所以具體是實現上,第一個實驗顯示4個影象,第二個實驗顯示8個影象。

3. 實驗任務3
綜合使用loop,[bx],編寫完整彙編程式,實現向記憶體b800:07b8開始的連續16個字單元重複填充字資料0237H。

assume cs:code
code segment
mov ax,0b800h
mov ds,ax
mov bx,07b8h
mov cx,000fh
s:mov [bx],0237h
inc bx
inc bx
loop s
mov ax,4c00h
int 21h
code ends
end

把填充的字資料,從0237H 改成0239H,再次儲存後,彙編、連結、執行,觀察結果。

把填充的字資料,從0237H 改成0437H,再次儲存後,彙編、連結、執行,觀察結果。

猜測並分析,這個字資料中高位位元組裡存放的是什麼資訊,低位位元組裡存放的是什麼資訊。

根據上圖猜測:高位位元組裡存放顏色資訊,低位位元組存放數字資訊。

4. 實驗任務4

  • 編寫完整彙編源程式,實現向記憶體0:200~0:23F依次傳送資料0~63(3FH)。
assume cs:code
code segment
    mov ax,0h
    mov ds,ax
    mov bx,0200h
    mov dx,0h    ;0~63(3fh)
    mov cx,40h
s:    mov ds:[bx],dl
    inc dx
    inc bx
    loop s    
    mov ax,4c00h
    int 21h
code ends
end

靈活使用debug的t命令、g命令、p命令除錯。在程式退出前,用d命令檢視0:200~0:23F,確認是否將0~3F傳送至此段記憶體區域。

t,p,d命令

g命令

5. 實驗任務5
教材實驗4(3)(P121)

assume cs:code
code segment
  mov ax,cs
  mov ds,ax
  mov ax,0020h
  mov es,ax
  mov bx,0
  sub cx,17
s:mov al,[bx]
  mov es:[bx],al
  inc bx
  loop s
  mov ax,4c00h
  int 21h
code ends

cx=10時,驗證

查得具體位置為17,將資料改成17,重新實驗。

複製後代碼。

因為將ax送給ds暫存器,表示傳送段地址位置,所以第一個空填入cs暫存器的值。

然後我們隨便在第二空填一個數,先填個10。然後用u命令來檢視mov ax,4c00h的具體位置,查得具體位置為17,將資料改成17所以第二空填17。