【實驗九】根據材料程式設計
阿新 • • 發佈:2018-12-07
四、實驗結論
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段位元組單元的被除數12mov 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 segmentstart: ; 補全程式,參考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.計算機語言真的是需要親身實踐,在實踐中找錯誤,在實踐中學習,花費時間,獲得知識,獲得成就感。