|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
;名称:doct
;功能:将word型数据转变为表示十进制数的字符串,字符串以0结尾符。
;参数:(ax)=word型数据
; ds:si指向字符串的首地址
;返回:无
;应用举例:编程,将数据12666以十进制的形式在屏幕上8行3列,用绿色显示出来。在显示时我们调用本次实难中的第一个子程序show_str.
assume cs:code,ds:data
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: xor bx,bx ;bx归零,准备用做计数器
mov bx,0
nu_in: mov cx,10 ;将cx用做除数
div cx ;除以CX,因为使用的是十六位除法,所以,商保存在AX里,余数保存在DX里
add dl,30h ;将余数加30H,得到ASCII码
push dx ;将DX入栈保存,使用栈的保存规则,使得到的ASCII码一会会以正序表达
xor dx,dx ;dx清零
inc bx ;计数器BX自增1
mov cx,ax ;将商赋给CX,以便JCXZ指令检测CX是否为零
jcxz pop_number ;JCXZ指令检测CX是否为零
jmp nu_in ;如果CX不为零,则跳回到NU——IN处重新开始程序
pop_number: mov cx,bx ;从此处开始向内存处写处ASCII码,这一步是先将先前得到的入栈次数做为循环次数使用
nu_out: pop ds:[si] ;将先产存入的ASCII码出栈到内存
inc si ;每出栈一次,将偏移量加一
loop nu_out ;循环
ret
code ends
end start
在DEBUG当中可以正常通过,为什么运行时就报告溢出了呢
dtoc: xor bx,bx ;bx归零,准备用做计数器
;mov bx,0
mov dx,0 ; 这样 ?
; dx:ax / cx
nu_in: mov cx,10 ;将cx用做除数
div cx ;除以CX,因为使用的是十六位除法,所以,商保存在AX里,余数保存在DX里
add dl,30h ;将余数加30H,得到ASCII码
push dx ;将DX入栈保存,使用栈的保存规则,使得到的ASCII码一会会以正序表达
xor dx,dx ;dx清零
inc bx ;计数器BX自增1
mov cx,ax ;将商赋给CX,以便JCXZ指令检测CX是否为零
jcxz pop_number ;JCXZ指令检测CX是否为零
jmp nu_in ;如果CX不为零,则跳回到NU——IN处重新开始程序
pop_number: mov cx,bx ;从此处开始向内存处写处ASCII码,这一步是先将先前得到的入栈次数做为循环次数使用
nu_out: pop ds:[si] ;将先产存入的ASCII码出栈到内存
inc si ;每出栈一次,将偏移量加一
loop nu_out ;循环
ret
|
|