1. 程式人生 > >【實驗九】根據材料編程

【實驗九】根據材料編程

而不是 play 操作 奇數 oop 綠色 tar 代碼 每次

四、實驗結論

1.

代碼:

; 在屏幕上輸出內存單元中的十進制兩位數
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段中保存的商的字節單元數值 or 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

步驟:

①編譯,連接

技術分享圖片

②運行

技術分享圖片

2.

代碼:

assume cs:code, ds:data
data segment
     db 12,35,96,55,67
     db ?,?
data ends
code segment
start:
      ; 補全程序,參考t1.asm,綜合應用以下知識完成:  
  mov ax,data
  mov
ds,ax mov cx,5 mov bx,0 mov ax,2200 s: mov ah,0 mov al,ds:[bx] ;註意,這裏分兩步,而不是mov ax,ds:[bx],這樣會進去兩個字節 mov dl,10 div dl ;理論上,ah存儲余數,al存儲商,應該先輸出al,在輸出ah mov ds:[5],al ;後面使用int 21h時,要令ah為2,這裏先把ah轉移 mov ds:[6],ah mov ah,2 ;輸出商 al,十位數 mov dl,ds:[5] or dl,30h int 21h mov ah,2 ;輸出余數 ah,個位數 mov dl,ds:[6] or dl,30h int 21h mov ah,2 ;經查閱,當dl為32時,或者20h,輸出空格 mov dl,32 int 21h inc bx loop s mov ax,4c00h int 21h code ends end start

步驟:

①編譯,連接

技術分享圖片

②執行

技術分享圖片

3.

; 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)段相應的單元內
        mov bx,0                 ;bx作為es的偏移地址,用來將字符移入es,即緩沖區,這裏,改編ds可改變輸出字符在屏幕出現的位置,例:1824是屏幕中間,這裏是第0行
        mov di,0                 ;di作為ds的偏移地址,用來將字符移出,每次加一
        mov cx,16                ;數一數,需要移動的字節是16個,設置循環16次 
s:      mov al,ds:[di]            ;匯編語言的操作,不允許兩個內存單元直接mov,使用al作為中介,千萬不能使用ax!!註意!!移動的是字節!!
        mov es:[bx],al
        inc bx                    ;由於在顯示緩沖區,奇數地址是存放字符,偶數地址是存放格式,這裏分兩步進行,上面兩行是移動字符
        mov dl,2                  ;用dl來存儲格式,這裏要求字體顏色是綠色,使dl為2,註意!!不要用dx!!因為放到內存單元裏的是字節!!
        mov es:[bx],dl            ;移動格式到偶數地址
        inc bx
        inc di
        loop s
        ; 學習第10章子程序後,還可以進一步完善優化,設計子程序,將行號、列號、顏色屬性設置成入口參數
        mov ax,4c00h
        int 21h
code ends
end start

技術分享圖片

②③與①大同小異,僅僅是改變上述代碼中dl的值,即屬性字節,關於屬性字節,我會在下一篇博客裏介紹,這裏不多贅述。


五、總結與體會

1.

任務二 錯誤代碼

assume cs:code, ds:data
data segment
     db 12,35,96,55,67
     db ?,?
data ends
code segment
start:
      ; 補全程序,參考t1.asm,綜合應用以下知識完成:  
  mov ax,data
  mov ds,ax
  mov cx,5
  mov bx,0
  mov ax,2200
  mov ss,ax
  mov sp,0100

s: mov ah,0
   mov al,ds:[bx]   ;註意,這裏分兩步,而不是mov ax,ds:[bx],這樣會進去兩個字節  
   mov dl,10
   div dl                ;理論上,ah存儲余數,al存儲商,應該先輸出al,在輸出ah
   

   mov dh,ah      ;後面使用int 21h時,要令ah為2,這裏先把ah轉移
 
   mov ah,2         ;輸出商 al,十位數
   mov dl,al
   or dl,30h
   int 21h

   mov ah,2         ;輸出余數 ah,個位數
   or dh,30h        ;此處出錯!
   int 21h

   mov ah,2         ;經查閱,當dl為32時,或者20h,輸出空格
   mov dl,32
   int 21h
 
   inc bx
   loop s
      
   mov ax,4c00h
   int 21h
code ends
end start

問題:使用dl,dh寄存器時,兩次輸出的都是dl裏的值。

技術分享圖片

解答:通過老師的教導,我明白了,dl可以看成一種接口,實現單個字符輸出的話,dl存放待輸出的字符,且ah要為2,來告訴計算機,int 21h是實現輸出的功能

2.計算機語言真的是需要親身實踐,在實踐中找錯誤,在實踐中學習,花費時間,獲得知識,獲得成就感。

【實驗九】根據材料編程