1.顯示字串
;子程式描述
;名稱: show_str
;功能:在指定的位置,用指定的顏色,顯示一 個用0結束的字串。
;引數: (dh)=行號(取值範圍0~24),(d)=列 號(取值範圍0~79),
;(cl)=顏色,ds:si指向字串的首位址
;返回:無
;應用舉例:在螢幕的8行3列,用綠色顯示data段中的字串。
assume cs:code,ds:data
data segment
db 'welcome to masm!',0
data ends
code segment
start:
mov dh,8 ;行號
mov dl,3 ;列號
mov cl,2 ;顏色
mov ax,data
mov ds,ax
call show_str
mov ah,4ch
int 21h
show_str:
mov ax,0b800h
mov es,ax ;使用ds和es暫存器作為段暫存器
mov al,160
mul dh
mov dh,0
dec dx
add ax,dx
add ax,dx
mov di,ax ;將計算出的第乙個字元的偏移位址存在di中
mov al, cl
s: mov bl, [si]
mov es:[di], bl ;存入字元
mov es:[di+1], al ;設定屬性位元組
inc si
add di,2 ;每個字元佔2個位元組
mov cx, [si]
jcxz ok ;遇0結束
jmp short s ;迴圈存入字元
ok: ret
code ends
end start
2.解決除法溢位的問題
;名稱: divdw
;功能:進行不會產生溢位的除法運算,被除數為dword型,除數為word型,結果為dword型。
;引數: (ax)=dword 型資料的低16位,(dx)=dword型資料的高16位,(cx)=除數
;返回: (dx)=結果的高16位,(ax)=結果的低,16位(cx)=餘數
;應用舉例:計算1000000/10(f420h/0ah)
;結果:(dx)=0001h,(ax)=86a0h,(cx)=0
;公式:
;x: 被除數,範圍: [0,ffffffff]
;n: 除數,範圍: [0, ffff]
;h: x高16位,範圍: [0, ffff]
;l: x低16位,範圍: [0, ffff]
;int():描述性運算子,取商,比如,int(38/10)=3
;rem():描述性運算子,取餘數,比如,rem(38/10)=8
;公式: x/n= int(h/n)*65536 +[rem(hn)*65536+l]/n
assume cs:code
code segment
start:mov ax, 4240h
mov dx, 000fh
mov cx, 0ah ;設定被除數與除數
call divdw
mov ah,4ch
int 21h
divdw:mov bp, ax ;將被除數的低16位暫存於bp
mov ax, dx
mov dx, 0
div cx ;h/n,結果為(dx)=rem(h/n),(ax)=int(h/n)
mov bx, ax ;將int(h/n)暫存至bx
mov ax, bp ;rem(h/n)*65536+l,結果為32位,高位存於dx,低位存於ax
div cx ;[rem(h/n)*65536+l]/n,結果商存於ax,餘數存於dx
mov cx, dx ;將餘數移至cx
mov dx, bx ;int(h/n)*65536後高位存於dx,低位為0
ret
code ends
end start
3.數值顯示
;名稱: dtoc
;功能: 將word型資料轉變為表示十進位制數的字串,字串以0為結尾符。
;引數: (ax)=word型資料,ds:si指向字串的首位址
;返回: 無
;應用舉例: 程式設計,將資料12666 以十進位制的形式在螢幕的8行3列,用綠色顯示出來。
assume cs:code,ds:data
data segment
db 10 dup(0) ;開闢記憶體空間儲存字串
data ends
code segment
start:
mov ax, 12666
mov bx, data
mov ds, bx
mov si, 0
call dtoc
mov dh,8 ;行號
mov dl,3 ;列號
mov cl,2 ;顏色
call show_str
mov ah,4ch
int 21h
dtoc:
mov bx, 10
mov dx, 0
div bx ;餘數存在dx
add dl,30h ;十進位制數字加30h為其ascii碼
mov [si], dl
inc si
mov cx,ax
jcxz over ;若ax為0則結束
jmp short dtoc
over:
mov ax, si
mov dx, 0
mov cx, 2
div cx
mov cx,ax
mov bx, 0
re: ;翻轉數字順序
mov al, [bx]
mov ah, [si-1]
mov [bx], ah
mov [si-1], al
inc bx
dec si
loop re
retshow_str:
mov ax,0b800h
mov es,ax ;使用ds和es暫存器作為段暫存器
mov si, 0
mov al,160
mul dh
mov dh,0
dec dx
add ax,dx
add ax,dx
mov di,ax ;將計算出的第乙個字元的偏移位址存在di中
mov al, cl
s:
mov bl, [si]
mov es:[di], bl
mov es:[di+1], al ;設定屬性位元組
inc si
add di,2 ;每個字元佔2個位元組
mov cx, [si]
jcxz ok ;遇0結束
jmp short s
ok: ret
code ends
end start
王爽《組合語言》第三版 實驗10
assume cs code data segment db welcome to masm 0 data ends code segment start mov dh,8 行 mov dl,3 列 mov cl,2 顏色 綠 mov ax,data mov ds,ax mov si,0 call ...
王爽《組合語言》 第三版 實驗10解析
assume cs code data segment db welcome to masm 0 data ends code segment start mov dh,8 mov dl,3 mov cl,2 mov ax,data mov ds,ax mov si,0 call show str ...
《組合語言》王爽第三版 實驗9
datas segment 此處輸入資料段 db w 00000010b,e 00000010b,l 00000010b,c 00000010b,o 00000010b db m 00000010b,e 00000010b,0,t 00100100b,o 00100100b,0 db m 01110...