前幾個實驗都沒記錄,實驗10想記錄一下!
名稱:show_str
功能:指定位置,指定顏色,顯示乙個以數字0結束的字串
引數:(dh)=行號,(dl)=列號,(cl)=顏色,ds:si->字串
返回:無
;ds:si->字串首位址
;dh行號 dl列號 cl顏色
;暫存器均不會被修改
show_str:
push es
push di
push ax
push bx
push cx
push dx ;將用到的暫存器入棧
mov ax,0b800h
mov es,ax
xor ax,ax
mov al,160
mul dh ;8位乘
xor dh,dh
add dx,dx
add ax,dx
mov di,ax ;es:di->指定顯示首位址
mov al,cl ;cl即將被用作判斷
xor bx,bx
s0: mov cl,ds:[si+bx]
jcxz ok0 ;若(cx)=0退出迴圈
mov es:[di+0],cl ;寫入要列印的字元
mov es:[di+1],al ;寫入要列印字元的顏色
inc bx
add di,2
jmp s0
ok0: pop dx
pop cx
pop bx
pop ax
pop di
pop es ;恢復被修改的暫存器
ret
名稱:divdw
功能:32位除商不會溢位(餘數自然不會溢位)
引數:(dx)(ax)=被除數,(cx)=除數
返回:(dx)(ax)=商,(cx)=餘數
;(dx)=h,(ax)=l,(cx)=n
;(dx)(ax)/(cx)=(dx)(ax)
;(dx)(ax)%(cx)=(cx)
;除返回所用暫存器外,其他均不會被修改
divdw:
push bx ;將用到的暫存器入棧
mov bx,ax ;(bx)=被除數低16位
mov ax,dx
xor dx,dx ;(dx)(ax)=h
div cx ;32位除,(ax)=h/n,(dx)=h%n
push ax ;壓入h/n
mov ax,bx ;(dx)(ax)=h%n*65536+l
div cx ;(ax)=(h%n*65536+l)/n
mov cx,dx ;(cx)=(dx)=餘數
pop dx ;(dx)(ax)=
; h/n*65536+(h%n*65536+l)/n
pop bx ;恢復被修改的暫存器
ret
名稱:dtoc
功能:將範圍在0-65535的資料轉化為十進位制字串,並新增數字0結尾
引數:(ax)=運算元據,ds:si->字串
返回:無
;ds:si->字串,(ax)=運算元據
;字串結尾新增數字0
;暫存器均不會被修改
dtoc:
push ax
push bx
push dx
push cx
push di ;將用到的暫存器入棧
xor di,di ;di記錄轉化後字串長度,方便ok1
s3: mov bx,10
xor dx,dx ;(dx)(ax)=運算元據
div bx
mov cx,ax
push dx ;將餘數壓入棧:若直接寫入string段則為逆序
inc di
jcxz ok1
jmp s3
ok1: mov cx,di
xor bx,bx
s4: pop ax
add ax,30h ;將數字(0-9)轉化為字元
mov ds:[si+bx],al ;!注意,這裡是al而不是ax
inc bx
loop s4
mov ds:[si+bx],0 ;結尾新增數字0
pop di
pop cx
pop dx
pop bx
pop ax ;恢復被修改的暫存器
ret
data segment
dw 123,12666,1,8,3,38
data ends
**如下:
assume cs:codesg,ds:data
data segment
dw 123,12666,1,8,3,38
data ends
string segment
string ends
stack segment
dw 0,0,0,0,0,0,0,0
dw 0,0,0,0,0,0,0,0 ;棧空間:0-1fh
stack ends
codesg segment
start:
mov ax,stack
mov ss,ax
mov sp,20h ;初始化棧
mov ax,string
mov ds,ax
xor si,si ;ds:si->字串
mov ax,data
mov es,ax
mov di,di ;es:di->運算元據集
mov dh,5
mov dl,20
mov cl,2 ;準備show_str引數:5行20列綠色
push cx ;記錄顏色資訊,cx即將被用作迴圈計數
mov cx,6
xor bx,bx
s1: mov ax,es:[di+bx] ;準備dtoc引數
call dtoc
mov ax,cx ;ax暫存迴圈計數
pop cx ;歸還顏色資訊給cx
call show_str
push cx
mov cx,ax ;歸還迴圈計數給cx
inc dh ;下個運算元據將列印在下一行,偷個懶哈哈哈
add bx,2
call dtoc
loop s1
mov ax,4c00h
int 21h
;ds:si->字串,(ax)=運算元據
;字串結尾新增數字0
;暫存器均不會被修改
dtoc:
push ax
push bx
push dx
push cx
push di ;將用到的暫存器入棧
xor di,di ;di記錄轉化後字串長度,方便ok1
s3: mov bx,10
xor dx,dx ;(dx)(ax)=運算元據
div bx
mov cx,ax
push dx ;將餘數壓入棧:若直接寫入string段則為逆序
inc di
jcxz ok1
jmp s3
ok1: mov cx,di
xor bx,bx
s4: pop ax
add ax,30h ;將數字(0-9)轉化為字元
mov ds:[si+bx],al ;!注意,這裡是al而不是ax
inc bx
loop s4
mov ds:[si+bx],0 ;結尾新增數字0
pop di
pop cx
pop dx
pop bx
pop ax ;恢復被修改的暫存器
ret;ds:si->字串首位址
;dh行號 dl列號 cl顏色
;暫存器均不會被修改
show_str:
push es
push di
push ax
push bx
push cx
push dx ;將用到的暫存器入棧
mov ax,0b800h
mov es,ax
xor ax,ax
mov al,160
mul dh ;8位乘
xor dh,dh
add dx,dx
add ax,dx
mov di,ax ;es:di->指定顯示首位址
mov al,cl ;cl即將被用作判斷
xor bx,bx
s0: mov cl,ds:[si+bx]
jcxz ok0 ;若(cx)=0退出迴圈
mov es:[di+0],cl ;寫入要列印的字元
mov es:[di+1],al ;寫入要列印字元的顏色
inc bx
add di,2
jmp s0
ok0: pop dx
pop cx
pop bx
pop ax
pop di
pop es ;恢復被修改的暫存器
retcodesg ends
end start
執行結果如下:
王爽《組合語言》第三版 實驗10 編寫子程式
1.顯示字串 子程式描述 名稱 show str 功能 在指定的位置,用指定的顏色,顯示一 個用0結束的字串。引數 dh 行號 取值範圍0 24 d 列 號 取值範圍0 79 cl 顏色,ds si指向字串的首位址 返回 無 應用舉例 在螢幕的8行3列,用綠色顯示data段中的字串。assume c...
王爽 組合語言 實驗10 1
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 mov si...
王爽 組合語言 實驗7
assume cs codesg,ds data ss stack data segment db 1975 1976 1977 1978 1979 1980 1981 1982 db 1983 1984 1985 1986 1987 1988 1989 1990 db 1991 1992 1993...