1. 程式人生 > >組合語言之實驗九

組合語言之實驗九

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 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

 補全程式碼如上所示

 

  將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

 

 

 

 

 

 找地址,然後通過三次迴圈輸出。