【實驗九】根據材料編程
阿新 • • 發佈:2018-12-07
而不是 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 movbl,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 movds,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.計算機語言真的是需要親身實踐,在實踐中找錯誤,在實踐中學習,花費時間,獲得知識,獲得成就感。
【實驗九】根據材料編程