實驗 4 [bx]和 loop 的使用

1、實驗目的

1. 理解和掌握寄存器間接尋址方式[bx]編程

2.  經過彙編指令 loop 的使用理解編程語言中循環的本質編程語言

3.  熟練掌握使用 debug 按需調試完整彙編源程序的方法oop

 

2、實驗準備

1. 學習/複習第 5 章使用[bx] loop 實現循環的編程應用示例(教材 5.5 節,5.8 節)學習

2.  複習第 3 章「棧」的知識spa

3.  結合第章課件,複習完整彙編源程序編寫→彙編→鏈接→運行→調試的方法debug

 

3、實驗內容

1.  綜合使用 loop,[bx],編寫完整彙編程序,實現向內存 b800:07b8 開始的連續 16 個調試

字單元重複填充字數據 0403Hcode

必作:綜合使用 loop, [bx], mov 實現blog

實現代碼以下:內存

assume cs:code
code segment
    mov ax,0b800h
    mov ds,ax
    mov cx,16
    mov bx,07b8H
    mov ax,0403h

s:  mov [bx],al
    inc bx
    mov [bx],ah
    inc bx
    loop s
mov ax,4c00h int 21h code ends end 

首先固然是設置bx和ds的值,將b800經過ax傳給ds(因爲b800是以字母開頭的,因此應當在前面加上一個0),bx的值設爲07b8h.

最後將ax的值設爲0403h,用於累加

這裏要加16次,顯然要使用loop循環,設置cx的值等於16以控制循環次數,用inc bx每次bx地址加1

一個字單元是16位的,採用小端法讀字

 

實驗結果以下:

這裏仍然使用了上一個實驗中所使用的process.bat簡化步驟,能夠看出輸出結果是一串紅心

 

2.  綜合使用 loop,[bx],編寫完整彙編源程序,實現向內存 0:200~0:23F 依次傳送數據

0~63(3FH)。

代碼以下:

assume cs:code
code segment
        mov ax,20h
        mov ds,ax
        mov bx,0
        mov cx,64

	s:mov [bx],bx
        inc bx
        loop s

        mov ax,4c00h
        int 21h
code ends
end 

首先邏輯地址0:200能夠寫成20:0,這樣改寫是爲了便於後面bx遞增,經過ax將20h傳入到ds中。

bx初值賦爲0,一共須要執行64次,將cx的值賦爲64以控制循環次數

恰好這裏須要傳送的數據0~63(3FH)與[bx]是一致的,數據0-63是64個連續的數字,0-3fH也是連續的64個編號。

咱們可使用一個bx變量就把偏移地址和數字的遞增都搞定。

因此循環段內容就寫成了如上的樣子

實驗結果以下:

彷佛沒有什麼變化和輸出,仿照前面實驗的經驗,咱們將屏幕清空後再次執行

依然沒有發現有任何的輸出結果,固然這個程序是執行了的,猜想可能改程序沒有輸出,只是在內部內存中發生了一些變化。

  

3.  教材實驗 4(3)(P121)

分析過程:

cs段寄存器中存儲的是指向程序代碼段的段地址。此實驗是將程序的代碼(按字節)複製,故將cs寄存器中的指向代碼的段地址賦值給ax,再經過ax寄存器賦值給ds段寄存器。

因此顯然第一個空應當填寫CS

對於第二個空,咱們須要填寫CX的值,即須要知道循環的次數,這是重點,此試驗是將"mov ax,4c00h"以前的指令複製到內存0:200處

因此沒有執行前咱們不知道次數,索性先隨便輸入一個CX值,反彙編看出"mov ax,4c00h"以前的機器碼長度

這裏咱們隨機輸了個10,代碼以下

assume cs:code
code segment
    mov ax,cs       
    mov ds,ax       
    mov ax,0020h
    mov es,ax 
    mov bx,0   
    mov cx,10    

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

    mov ax,4c00H
    int 21H
code ends
end

  

 

Debug後查看和反彙編的內容如上

CX的值爲1C,即整個代碼長度

咱們發現mov ax,4cooh/int 21h它們共佔用了5個字節。因此在本實驗中咱們須要複製的代碼字節數是001CH-0005H=0017H==23個字節,故cx計數寄存器賦值爲23或17H。

故正確的代碼以下

assume cs:code
code segment
    mov ax,cs       
    mov ds,ax       
    mov ax,0020h
    mov es,ax 
    mov bx,0   
    mov cx,17h    

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

    mov ax,4c00H
    int 21H
code ends
end

 成功編譯鏈接後,咱們進入Debug,對0020:0(即0:200)處,長度爲17h的內存進行反彙編,查看其中的內容

 

經查看發現確實是mov ax,4c00h"以前的指令複製到內存0:200處,實驗成功!!!

 

5、總結與體會

(1)不只能夠向內存中寫入數據,還能夠複製代碼

(2)在必須執行過一次才能知道結果的狀況下,咱們能夠先假設再得出準確的數值

(3)loop的做用很大,極大的減小沒必要要的重複操做

相關文章
相關標籤/搜索