實驗九--根據材料程式設計
阿新 • • 發佈:2018-12-12
實驗內容:
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 moval,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能力