assume cs:code,ds:data,ss:stack
data segment
db 10 dup(0)
data ends
stack segment
db 16 dup(0)
stack ends
code segment
start: mov ax,data
mov ds,ax
mov ax,12666
mov si,0
call dtoc
mov ax,4c00h
int 21h
;-------------------------------------------------------------------
;名称:dtoc
;功能:将WORD型数据变为表示十进制数的字符串,字符串以0为结尾符。
;参数:(ax)=word型数据,ds:si指向字符串的首地址
;返回:无
dtoc:
mov cx,0
push cx
s0:mov cx,0Ah
call divdw
add cl,30h
push cx ;将余数压入栈,做交换准备
mov cx,ax
jcxz exit0 ;判断商是否为零
jmp short s0
exit0:pop cx
jcxz s2
mov ds:[si],cl
inc si
jmp short exit0
s2:mov dh,1
mov dl,1
mov cl,12
mov si,0
call show_str
ret
;-----------------------------------------------------------------------
;名称:divdw
;公式:x/n=int(H/n)*65535+[rem(H/n)+L]/n
;功能:进行不会产生溢出的除法,被除数为DWORD型,除数为WORD型,结果为DWORD
;参数:(ax)=dword型的数据的低16位(DX)=DWORD型数据的高16位,(CX)除数
;返回:(DX)=结果的高16位,(AX)=结果的低16位,(CX)=余数
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
;-------------------------------------------------------------------------------
;显示字符串子程序
;名称:show_str
;功能:在指定的位置,用指定的颜色,显示一个用0结束的字符串
;参数:(DH)=行号(取值范围1-25),(DL)=列号(取值范围1-80)(CL)=颜色
; DS:SI指向字符串的首地址
show_str:
mov ax,0b800h
mov es,ax
mov al,0A0h
dec dh
mul dh
mov bx,ax
mov al,2
dec dl
mul dl
mov di,ax
mov al,cl
s:mov ah,ds:[si]
mov ch,ah ;判断是否是0字符
mov cl,0
jcxz return
mov es:[bx+di],ah
mov es:[bx+di+1],al
add di,2
inc si
jmp short s
return:
ret
code ends
end start
在win-masm中编译运行,在显示出603795834
在debug中用G命令执行后是12666
正确结果应该是12666,可就是不知道为什么?
各位帮我看看,谢谢! |