組合語言之實驗九
阿新 • • 發佈:2018-12-09
1. 補全程式t1.asm,完成在螢幕上輸出記憶體單元中的十進位制兩位數
; 在螢幕上輸出記憶體單元中的十進位制兩位數 assume cs:code, ds:data data segment db 12 db 0h,0h ; 前一個位元組用於儲存商,後一個位元組用於儲存餘數 data ends code segment start: mov ax,data ; 補全指令,使得ds <-- data段地址 mov ds,ax mov ah,0 mov al,ds:[0] ;ax <-- data段位元組單元的被除數12 mov bl,10h 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 21hmov ah,2 mov dl,ds:[2] ;補全程式碼,使得dl <-- data段中儲存餘數的位元組單元數值 add dl,30h ; 補全程式碼,使得dl中的數值轉換為數字字元 int 21h mov ax,4c00h int 21h code ends end start
補全程式碼如上所示
將data段的段地址傳給ax暫存器,ax暫存器再給ds暫存器(因為8086CPU不允許將一個數值直接送入段暫存器)
《div是除法指令,1)除數有8位和16位兩種,在一個reg或記憶體單元中。
2) 被除數預設放在AX或DX和AX中,如果除數為8位,被除數則為16位,預設在AX中存放;如果除數為16位,被除數為32位,在DX和AX中存放,DX存放高16位,AX存放低16位
3)結果:如果除數為8位,則AL儲存除法操作的商,AH儲存除法操作的餘數;如果除數為16位,則AX儲存除法操作的商,DX儲存除法操作的餘數》
mov ah,2 為二號功能呼叫,字元輸出,並且要輸出的字元是已經放在dl裡面的,呼叫2號中斷,傳遞給2號中斷向量對應的中斷處理程式的引數值為2.事實上,2號中斷表示在顯示器螢幕上顯示,這裡要顯示的是存放在dl裡的字元
.int 21h是DOS系統系統呼叫入口。
add dl,30h 意為把dl資料數字化,數字與數字字元ASCII碼值間相差48,即30h
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 dl,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
這個和實驗一內容類似,只是多組轉化輸出,外加空格。大同小異
3. 教材實驗9(P187)
實驗9 顯示三行welcome to masm(三個程式)
程式設計:在螢幕中間分別顯示綠色,綠底紅色,白色藍底的字串’welcome to masm!’
; 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
找地址,然後通過三次迴圈輸出。