實驗9 根據材料編程
阿新 • • 發佈:2018-12-08
執行 行號 註釋 不難 成功 任務 .com 結合 star
1. 補全程序 t1.asm,完成在屏幕上輸出內存單元中的十進制兩位數
補全得t1。asm如下:
1 ; 在屏幕上輸出內存單元中的十進制兩位數 2 assume cs:code, ds:data 3 data segment 4 db 12 5 db 0h,0h ; 前一個字節用於保存商,後一個字節用於保存余數 6 data ends 7 code segment 8 start: 9 mov ax,data ; 補全指令,使得ds <-- data段地址 10 mov ds,ax 11 12 movah,0 13 mov al,ds:[0] ; ax <-- data段字節單元的被除數12 14 mov bl,10 15 div bl 16 mov ds:[1],al ; 補全代碼,讓商保存到data段註釋中指定的單元 17 mov ds:[2],ah ; 補全代碼,讓余數保存到data段註釋中指定的單元 18 19 mov ah,2 20 mov dl,ds:[1] ; 補全代碼,使得dl <-- data段中保存的商的字節單元數值 21 add dl,30h ;補全代碼,使得dl中的數值轉換為數字字符 22 int 21h 23 24 mov ah,2 25 mov dl,ds:[2] ; 補全代碼,使得dl <-- data段中保存余數的字節單元數值 26 add dl,30h ; 補全代碼,使得dl中的數值轉換為數字字符 27 int 21h 28 29 mov ax,4c00h 30 int 21h 31 code ends 32 end start
在此代碼段中,div指令使al/10,除數為八位,al存儲除法操作的商,ah存儲除法操作的余數,倘如為16位,ax,則存儲商,dx存儲余數。
mov ah,2 為二號功能調用,輸出dl內的字符格式內容
add dl,30h 意為把dl內容數字字符畫,數字與數字字符ASCII碼值間相差48,即30h
成功編譯連接:
可得如下結果,成功輸出“12”:
2. 補全程序 t2.asm,完成在屏幕上輸出 data 段定義的 5 個十進制兩位數,數據和數據
之間以空格間隔。
補全得t2.asm,如下:
1 assume cs:code, ds:data 2 data segment 3 db 12,35,96,55,67 4 data ends 5 code segment 6 start: 7 mov ax,data; 補全程序,參考t1.asm,綜合應用以下知識完成: 8 mov ds,ax 9 mov si,0 10 mov cx,0005 11 12 s: mov ah,0 13 mov al,ds:[si] 14 mov bl,10 15 div bl 16 19 mov bh,ah 20 21 mov ah,2 22 mov dl,al 23 add dl,30h 24 int 21h 25 26 ;mov ah,2 27 mov dl,bh 28 add dl,30h 29 int 21h 30 31 ;mov ah,2 32 mov dl,32 33 int 21h 34 add si,1; 35 loop s 36 37 ; (1) loop指令、內存單元地址的靈活表示 38 ; (2) div指令, 數字→數字字符的轉換 39 ; (3) int 21h的2號子功能,完成單個字符輸出的方法,即: 40 ; mov ah,2 41 ; mov dl,待輸出字符或其ASCⅡ碼 42 ; int 21h 43 ; (4) 數據和數據之間以空格間隔的實現: 使用(3)輸出空格字符 44 45 mov ax,4c00h 46 int 21h 47 code ends 48 end start
原理同任務1,關於al和ah的數值移動,al保留,因為其它內容不曾動用ax的低八位寄存器,故可直接賦給dl,
ah中的數值則間接通過bh傳至dl;
空格則直接賦予dl=32,對應空格字符
成功編譯連接:
可得如下結果,成功輸出數字字符串:
3.編程:在屏幕中間分別顯示綠色、綠底紅色、白底藍色的字符串‘welcome to masm!‘
編寫代碼如下:
1 ; p187 實驗9 2 3 assume ds:data, cs:code 4 data segment 5 db ‘welcome to masm!‘ 6 db 2H,24H,71H ;字符串屬性值 7 data ends 8 9 code segment 10 start: mov ax,data 11 mov ds,ax ;字符串及屬性值所在段的段地址送入ds 12 13 mov ax,0b800H 14 mov es,ax ;80×25彩色字符模式顯示緩沖區段地址送入es 15 16 mov di,0 17 mov bx,1820 18 19 mov cx,3 20 21 s: push cx 22 mov si,0 23 mov cx,16 24 s0: mov al,ds:[si] 25 mov es:[bx],al 26 27 mov al,ds:[16+di] 28 mov es:[bx+1],al 29 30 inc si 31 add bx,2 32 loop s0 33 34 add di,1 35 add bx,128 36 pop cx 37 loop s 38 ; 添加代碼,通過循環逐個將每個字符及其屬性送入相應的顯示緩沖區對應行 39 ; 即:將data段的字符及屬性通過循環逐個mov到顯示緩沖區(es)段相應的單元內 40 41 ; 可以先嘗試分別寫三段代碼,每次完成一行的顯示 42 ; 程序運行起來後,再嘗試通過靈活的尋址方式和循環,對三段代碼修改和簡化 43 ; 學習第10章子程序後,還可以進一步完善優化,設計子程序,將行號、列號、顏色屬性設置成入口參數 44 45 46 mov ax,4c00h 47 int 21h 48 code ends 49 end start
代碼段中的顯示緩沖區位於B800H~BFFFFH共32KB的空間中,緩沖區分為25行,80列,代碼段中使用b800h為段地址,經過不斷調試與磨合,本人選區以偏移地址為1820(十進制)開始的區域寫入字符內容和屬性值,因為每行相差160個字節內容,而字符串為16個字節,又結合屬性值,總共占有16*2個字節,故本人通過add bx,160-16*2來換行對齊。
該代碼段使用雙重循環,共執行3*16次。
成功編譯連接:
可成功得如下執行結果:
本次實驗循序漸近,任務內容難度逐漸提高,但本質上大同小異,會做任務1,通過自我探索,不難實現任務2、3。
實驗9 根據材料編程