assume cs:code
data segment
dd 12345,1266688
data ends
stack segment
dw 8 dup(?)
stack ends
code segment
start:
mov ax,data
mov ds,ax
mov si,0
mov ax,0b800h
mov es,ax
mov bp,12*160+20*2
mov di,0
mov ax,stack
mov ss,ax
mov sp,10h
mov cx,2 ;两个数两次循环
s: push cx ;将cx压栈;后面会用到cx寄存器
call dtoc ;调用函数,他会将数字转化成字符串显示出来
pop cx
add si,4
loop s
mov ax,4c00h
int 21h
dtoc:
mov ax,[si]
mov dx,[si+2] ;被除数
dt0:call divdw ;调用divdw
mov cx,ax ;把低八位的商赋给cx,为零则跳转,不为零则继续执行
jcxz dt1
add bx,30h ;转化成字符
push bx ;将字符压入栈中压榨
inc di ;记录压入栈的字符的个数
mov cx,0ah ;把除数赋给cx
jmp short dt0
mov cx,di ;把压入栈的字符的个数赋给cx,即为循环次数
dt1:pop es:[bp] ;把字符存放在显存段中
mov byte ptr es:[bp+1],02h ;设置显示字符为绿色
add bp,2
loop dt1
ret
divdw: ;不会溢出的除法运算,将商的低八位保存在ax,高八位保存在dx,余数保存在bx中。借助王爽老师课本的公式。
mov cx,dx ;将被除数的高八位赋给cx,为零则进行普通的除法运算
jcxz divdw1
mov cx,0ah
push ax ;将ax压入栈
mov ax,dx ;把被除数的高八位传给ax
div cl
mov bl,al ;把商给bl;之后会赋给dl,这就是高八位的商
mov dl,ah ;把余数给dl,与ax组成新的被除数
pop ax
div word ptr cx
mov cx,dx ;把余数赋给cx
mov dl,bl ;将高八位的商给bx
mov bx,cx ;余数保存在bx中,因为cx之后还要用
ret
divdw1:
mov cx,0ah
div cx
mov bx,dx
mov dx,0
ret
code ends
end start
代码重发一次,刚刚没看到这个功能。。。。 |