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

【實驗九】根據材料程式設計

四、實驗結論

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.計算機語言真的是需要親身實踐,在實踐中找錯誤,在實踐中學習,花費時間,獲得知識,獲得成就感。