1. 显示字符串
代码
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:
push ax
push es
push di
push dx
push bx
push si
mov ax,0b800h ;显存显示地址起始位置
mov es,ax
mov di,0
mov al,0A0h ;每行
dec dh ;行号从0开始算, 所以8-1=7, 0-7
mul dh ;第N-1行
add di,ax
mov al,2 ;每列 0-1 2-3 4-5
dec dl ;与行号同理
mul dl ;第N-1列
add di,ax
mov bl,cl ;保存着色
s:
mov cl,[si] ;从字符串首地址开始
mov ch,0
jcxz ok ;循环字符串每个字符,直到遇见0,跳转到 标记 ok
mov es:[di],cl ;显存显示规则 每个字符占用两个字节 前者存储字符本身本身
mov es:[di+1],bl ;显存显示规则 后者存储闪烁、背景、高亮、前景等
add di,2
inc si
loop s
ok:
pop ax
pop es
pop di
pop dx
pop bx
pop si
ret
code ends
end start
结果
2. 解决除法溢出的问题
使用 000F(dx 高位) 4240(ax 低位) / 0A(cx 除数)
结果存储在 XXXX(dx 高位) XXXX(ax 低位) XX(cx 余数)
示例:
000F 4240 / 0A
1)0000 000F / 0A = 0001(商) … 0005(余数)
2)0005 4240 / 0A = 86A0 (商)… 0000 无余数
3)结果 0001 86A0
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
mov ax,dx
mov dx,0
div cx
mov bx,ax
pop ax
div cx
mov cx,dx
mov dx,bx
ret
code ends
end start
结果
3. 数值显示
assume cs:code
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 ax,4c00h
int 21h
dtoc: push ax
push bx
push si
mov bx,10
mov si,0
s1: mov dx,0
div bx
add dx,30h
push dx
mov cx,ax
inc si
inc cx
loop s1
mov cx,si
mov si,0
s2: pop [si]
inc si
loop s2
pop si
pop bx
pop ax
ret
show_str: push ax
push es
push di
push dx
push bx
push si
mov ax,0b800h ;显存显示地址起始位置
mov es,ax
mov di,0
mov al,0A0h ;每行
dec dh ;行号从0开始算
mul dh ;第N行
add di,ax
mov al,2 ;每列
mul dl ;第N列
add di,ax
mov bl,cl ;保存着色
s:
mov cl,[si]
mov ch,0
jcxz ok
mov es:[di],cl
mov es:[di+1],bl ;显存显示规则
add di,2
inc si
loop s
ok:
pop ax
pop es
pop di
pop dx
pop bx
pop si
ret
code ends
end start
显示结果