子程序编写
显示字符串
名称: show_str
用例:在屏幕的八行三列,用绿色显示data 段的字符串
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
mov ax,4c00h
int 21h
;说明:show_str 显示0前字符串
;参数:(dh)=行号 (dl)=列号 (cl)=颜色
show_str:
dec dh
mov al,0a0h
mul dh
mov bx,ax
dec dl
mov al,2h
mul dl
add bx,ax
mov ax,0b800h
mov es,ax
mov al,cl
s:
mov cx,ds:[si]
jcxz ok
mov dx,[si]
mov es:[bx],dx
inc bx
mov es:[bx],al
inc bx
inc si
jmp s
ok:
ret
code ends
end start
数据显示
名称: dtoc and show_str
用例:打印 12666
assume cs:code,ds:data
data segment
db 10 dup (0)
data ends
code segment
start: mov ax,12666
mov bx,data
mov ds,ax
mov si,0
call dtoc
mov dh,8
mov dl,3
mov cl,2
call show_str
;名称:dtoc
;功能:将数据转换成十进制字符串,0结尾
;参数:(ax) word型数据 ds:si指向字符串首地址
;无返回
dtoc:
mov cx,10
m:
div cx
push cx
mov cx,dx
jcxz o
pop cx
add dx,30h
push ax
mov ax,dx
mov ds:[si],ax
pop ax
inc si
jmp m
o: ret
;show_str
;在指定位置显示数据段以0结尾的字符串
;(dh) 行号 (dl) 列号 (cl) 颜色 ds:si指向字符串的首地址
;无返回值
show_str:
mov ax,0b800h
mov es,ax
mov bl,0a0h
mov al,dh
dec al
mul bl
push ax
dec dl
mov al,2
mul dl
pop bx
add bx,ax
mov di,0
mov al,cl
s:
mov cx,ds:[di]
jcxz ok
push ax
mov ax,ds:[di]
mov es:[di],ax
pop ax
inc di
mov es:[di],al
jmp s
ok:
ret
code ends
end start
除法溢出问题
assume cs:code
code segment
start:
mov ax,4240h
mov dx,000fh
mov cx,0ah
call divdw
mov ax,4c00h
int 21h
divdw:
push ax
push cx
mov ax,dx
div cx
mov bx,ax
pop cx
pop ax
push bx
push ax
mov bx,ax
mov ax,dx
div dx
mov bx,ax
pop ax
mov cx,ax
add ax,bx
div cx
push ax
push dx
pop cx
pop ax
pop dx
ret
code ends
end start