1. 程式人生 > >實驗報告:實驗九

實驗報告:實驗九

實驗內容:

1. 補全程式 t1.asm,完成在螢幕上輸出記憶體單元中的十進位制兩位數。

 

; 在螢幕上輸出記憶體單元中的十進位制兩位數
assume cs:code, ds:data
data segment
     db 12
     db ?,?   ; 前一個位元組用於儲存商,後一個位元組用於儲存餘數
data ends
code segment
start:
      mov ax,data
      mov ds,ax       ; 補全指令,使得ds <-- data段地址
      
      mov ah,0
      mov al,ds:[0]   ; ax <-- data段位元組單元的被除數12
      mov bl,10
      div bl
      mov  ds:[1],al    ; 補全程式碼,讓商儲存到data段註釋中指定的單元
      mov  ds:[2],ah    ; 補全程式碼,讓餘數儲存到data段註釋中指定的單元

      mov ah,2
      mov dl,ds:[1]    ; 補全程式碼,使得dl <-- data段中儲存的商的位元組單元數值
      add dl,30h       ; 補全程式碼,使得dl中的數值轉換為數字字元
      int 21h

      mov ah,2
      mov dl,ds:[2]     ; 補全程式碼,使得dl <-- data段中儲存餘數的位元組單元數值
      add dl,30h        ; 補全程式碼,使得dl中的數值轉換為數字字元      
      int 21h

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

  

add cx, 30H,表示把cx中的餘數(數字)轉變成字元,因為,‘0’的ASCII碼為30H

2. 補全程式 t2.asm,完成在螢幕上輸出 data 段定義的 5 個十進位制兩位數,資料和資料
之間以空格間隔。

assume cs:code, ds:data
data segment
     db 12,35,96,55,67
data ends
code segment
start:
      ; 補全程式,參考t1.asm,綜合應用以下知識完成:
      ; (1) loop指令、記憶體單元地址的靈活表示
      ; (2) div指令, 數字→數字字元的轉換
      ; (
3) int 21h的2號子功能,完成單個字元輸出的方法,即: ; mov ah,2 ; mov dl,待輸出字元或其ASCⅡ碼 ; int 21h ; (4) 資料和資料之間以空格間隔的實現: 使用(3)輸出空格字元 mov ax,data mov ds,ax mov bx,0 mov cx,5 s: mov ah,0 mov al,ds:[bx] mov dl,10 div dl mov dl,al mov dh,ah mov ah,
2 add dl,30h int 21h mov ah,2 mov dl,dh add dl,30h int 21h mov ah,2 mov dl,0 int 21h inc bx loop s mov ax,4c00h int 21h code ends end start

程式碼如上結果如下:

可以從圖中看出我原來的結果只能出現第一組數即:12 00 00 00

原因是一開始我將除數存在bl中,但是我又使用了bx作為偏移地址,結果兩者相互影響和修改了。

經過請教同學,將除數存在dl中,每次迴圈更新dl,dl的輸出並不受影響,結果方才正確。

3.書P187實驗9

本實驗需要計算螢幕中間三行對應位置的單元數,我只大概進行了粗略了估算。

 

; p187 實驗9

assume ds:data, cs:code
data segment
       db 'welcome to masm!'  
       db 2H,24H,71H          ;字串屬性值
data ends

code segment
start:  mov ax,data
        mov ds,ax            ;字串及屬性值所在段的段地址送入ds
        
        mov ax,0b800H
        mov es,ax            ;80×25彩色字元模式顯示緩衝區段地址送入es
        
        ; 新增程式碼,通過迴圈逐個將每個字元及其屬性送入相應的顯示緩衝區對應行
        ; 即:將data段的字元及屬性通過迴圈逐個mov到顯示緩衝區(es)段相應的單元內
        
        ; 可以先嚐試分別寫三段程式碼,每次完成一行的顯示
        ; 程式執行起來後,再嘗試通過靈活的定址方式和迴圈,對三段程式碼修改和簡化
        ; 學習第10章子程式後,還可以進一步完善優化,設計子程式,將行號、列號、顏色屬性設定成入口引數
        
        mov cx,3
        mov bx,0
        mov bx,1760
        mov bp,0

s:      push cx
        mov cx,16
        mov di,0
        mov si,66

s1:     mov al,ds:[di]
        mov es:[si+bx],al
        inc si
        mov al,ds:[bp+10h]
        mov es:[si+bx],al
        inc si
        inc di
loop  s1
        inc bp
        add bx,160
        pop cx
loop s
        mov ax,4c00h
        int 21h
code ends
end start

結果如上圖。

 總結和體會:

1.對彙編中輸出字元數字的方法程式有所掌握。

2.更加熟練運用迴圈,雙重迴圈壓棧保護cx理解更深刻。

3.對於彙編中彩色字元模式中的知識點有所掌握。