解决除法溢出
assume cs:code
code segment
start:mov ax,9680h ;L
mov dx,98h ;H
mov cx,0ah ;除数
call divdw
mov ax,4c00h
int 21h
divdw:push ax
mov ax,dx ;将H放到低4位
mov dx,0
div cx ;此时ax中存储int(H/N),dx中存储rem(H/N)
mov bp,ax
mov bx,dx
;乘上65536=16^4,相当于左移四位,也就是将数据放入高4位
pop ax
div cx ;此时ax中存储int(rem(H/N)*65536+L)/N,dx储存余数
mov cx,dx
mov dx,bp
ret
code ends
end start
显示数字
assume cs:code,ds:data,ss:stack
data segment
dd 10 dup (10)
data ends
stack segment
dd 30 dup (0)
stack ends
code segment
start:mov ax,stack
mov ss,ax
mov sp,30
mov ax,1a80h
mov dx,6
mov bx,data
mov ds,bx
mov si,0
mov di,0 ;计算位数
call dtoc
mov dh,8 ;行号
mov dl,10 ;列号
mov cl,2
mov ax,data
mov ds,ax
mov si,0
call show_str
mov ax,4c00h
int 21h
dtoc:mov bx,10 ;dtoc的共能:先将各个位置的数字压入栈中,再调用
push ax
mov ax,dx ;将H放到低4位
mov dx,0
div bx ;此时ax中存储int(H/N),dx中存储rem(H/N)
mov bp,ax
;乘上65536=16^4,相当于左移四位,也就是将数据放入高4位
pop ax
div bx ;此时ax中存储int(rem(H/N)*65536+L)/N 的商,dx储存余数
add dx,30h
push dx
inc di
mov dx,bp
mov cx,ax ;判断商的低4位是否为0,为0则跳转到dtoc1,继续判断商的高4位是否为0
jcxz dtoc1
inc cx
loop dtoc
dtoc1:mov cx,dx
jcxz dtoc2 ;商的高4位也为0,说明dtoc的运算可以结束了
inc cx
loop dtoc ;否则继续运算
dtoc2:mov cx,di
dtoc3:pop ax
mov [si],ax
inc si
loop dtoc3
ret
show_str:mov ah,0
mov al,dl
mov bp,ax
sub bp,1
add bp,bp
mov ax,0b800h
mov es,ax
mov ch,0
push cx
mov cl,dh
sub cx,1
s:add bp,0a0h
loop s
str:mov ch,0
mov cl,ds:[si]
jcxz str1 ;获取当前元素后,判断是否为0
mov al,ds:[si]
mov es:[bp],al
pop cx ;取出字的属性
inc bp
mov es:[bp],cl
push cx ;保存字的属性
inc si
inc bp
loop str
str1:pop cx
ret
code ends
end start
显示字符串
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,0
call show_str
mov ax,4c00h
int 21h
show_str:mov ah,0
mov al,dl
mov bp,ax
sub bp,1
add bp,bp
mov ax,0b800h
mov es,ax
mov ch,0
push cx
mov cl,dh
sub cx,1
s:add bp,0a0h
loop s
str:mov ch,0
mov cl,ds:[si]
jcxz ok ;获取当前元素后,判断是否为0
mov al,ds:[si]
mov es:[bp],al
pop cx ;取出字的属性
inc bp
mov es:[bp],cl
push cx ;保存字的属性
inc si
inc bp
loop str
ok:pop cx
ret
code ends
end start