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

實驗九--根據材料程式設計

實驗內容:

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

; 在螢幕上輸出記憶體單元中的十進位制兩位數
assume cs:code, ds:data
data segment
     db 12
     db 0h,0h   ; 前一個位元組用於儲存商,後一個位元組用於儲存餘數
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 少打了一個","導致編譯總是不通過

補全指令,使得ds <-- data段地址,不能直接移動,要通過中間量ax才可以

另外如果要將某記憶體單元的資料移入一個地址中,可以直接地址操作

 

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 cx,5h
    mov di,0h

s:    mov ah,0
    mov al,ds:[di]
    mov bl,10
    div bl
    mov ds:[5],al
    mov ds:[6],ah
    
    mov ah,2
    mov dl,ds:[5]
    add dl,30h
    int 21h
    
    mov ah,2
    mov al,ds:[6]
    add dl,30h
    int 21h

    mov ah,2
    mov dl,32
    int 21h

    add di,1h
    loop s
    
    mov ax,4c00h
    int 21h
code ends
end start
      
      mov ax,4c00h
      int 21h
code ends
end start

編譯,連線和執行

實驗結論:第二個小實驗和第一個小實驗很類似的,只不過是多了幾組數和迴圈罷了

 

3. 教材實驗 9(P187)

; p187 實驗9

assume ds:data, cs:code
data segment
       db 'welcome to masm!'  ;共16個字元
       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 bx,0
     mov si,0
     mov cx,16

s0:  mov ax,[bx]
     mov es:[bx+720h][si],ax
     mov al,2               ;存放顏色屬性值綠色
     mov es:[bx+721h][si],al
     inc bx
     inc si
    loop s0
 

     mov bx,0
     mov cx,16
     mov si,160

s1:  mov ax,[bx]
     mov es:[bx+720h][si],ax
     mov al,36            ;綠底紅色
     mov es:[bx+721h][si],al
     inc bx
     inc si
     loop s1

 

     mov bx,0
     mov cx,16
     mov si,320

s2:  mov ax,[bx]
     mov es:[bx+720h][si],ax
     mov al,113            ;白底藍色
     mov es:[bx+721h][si],al
     inc bx
     inc si
     loop s2

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

這段程式,參考了網上的別人的答案

編譯和執行後

總結:這次實驗是通過網上的資源才完成的,不過是在理解後自己又手寫一遍的

看來還是要加強code能力