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:
mov ax,0b800h ;显存地址
mov es,ax
mov al,160 ;显存每行显示80个字符,共160个字节,每列2个字节
mul dh
mov di,ax ;di中存放行偏移量
mov al,2
mul dl
add di,ax ;di中存放总的偏移量
mov dh,cl ;寄存器cx需要用作判断是否为0
s:
mov ch,0
mov cl,[si]
mov dl,cl ;低位放字符,高位放属性
mov es:[di],dx
inc si
add di,2
jcxz ok
loop s
ok:
ret
code ends
end start
2 解除除法溢出问题
把一个数放在了dx,高位寄存器中,那么就相当于 乘以65536.即int(H/N)65536 就相当于把int(H/N)放在了dx中。
assume cs:code,ss:stack
stack segment
db 16 dup(0)
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,16
mov ax,4240H
mov dx,000FH
mov cx,0AH
call divdw
mov ax,4c00h
int 21h
divdw:
push ax ; 低位数据入栈,使用div需要占用ax寄存器
mov ax,dx ; 将被除数(X的高16位)放入被除数的低16位ax中
mov dx,0 ; 将被除数的高十六位dx清零
div cx ; int(H/N), 存入ax(商)中,rem(H/N)存入dx(余数)中
mov bx,ax ; bx中保留高位商,注意此时的dx中存放着高位余数
pop ax ; 取出X的低位
div cx ; 相当于(rem(H/N)*65535 +L)/N,rem(H/N)*65535已经在dx中
mov cx,dx ; 余数保存在cx里
mov dx,bx ; dx保存的是最终结果的高位
ret
code ends
end start
3 数值显示
assume cs:code
data segment
db 10 dup (0)
data ends
stack segment
dw 8 dup (0)
stack ends
code segment
start:
mov ax,12666
mov bx,data
mov ds,bx
mov bx,stack
mov ss,bx
mov sp,16
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 si
mov bx,10
s0:
mov dx,0
div bx ; ax/bx
add dx,30H ; 余数加30
push dx ; 入栈
mov cx,ax
inc si ; 记录循环次数
inc cx
loop s0
mov cx,si ; cx 为循环次数,记录出栈个数
mov si,0
s1:
pop ds:[si] ; 将栈中转化好了的数据放到内存中
inc si
loop s1
pop si
pop ax
ret
show_str:
mov ax,0b800h ;显存地址
mov es,ax
mov al,160 ;显存每行显示80个字符,共160个字节,每列2个字节
mul dh
mov di,ax ;di中存放行偏移量
mov al,2
mul dl
add di,ax ;di中存放总的偏移量
mov dh,cl ;寄存器cx需要用作判断是否为0
s:
mov ch,0
mov cl,[si]
mov dl,cl ;低位放字符,高位放属性
mov es:[di],dx
inc si
add di,2
jcxz ok
loop s
ok:
ret
code ends
end start