这是代码的初稿,功能实现了,但是结构化上面感觉不是太满意,用了较多的内存交换数据的方式,移植性不太好(谁说汇编要可移植的)。重新写了一个防止溢出的除法,被除数是word型的,好了,贴代码:
assume cs:code,ds:data,ss:stack
data segment
db 16 dup (0) ;前两个字节保存除法的商,第三个自己是余数,第四第五个字节为字符个数
db 16 dup (0)
data ends
stack segment
db 128 dup (0)
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,128
mov ax,data
mov ds,ax
mov si,0
mov ax,12666 ;要转化为字符串的数
call dtoc
mov ax,4c00h
int 21h
dtoc:
push ax
push cx
push bx
push si
mov bl,0ah
mov si,0
s0: call divw
mov ah,ds:[2] ;从内存区取余数
add ah,30h
mov [si+16],ah ;将余数变为字符后存入内存
inc si
mov cx,ds:[0] ;从内存中取商,判断商是否为0
jcxz tran_ok
mov ax,cx ;将商赋给ax,准备下一次除法
inc cl ;若值为1,则还要进行一次循环
loop s0
tran_ok:
dec si
mov ds:[3],si ;保存字符个数
call reverse ;转换字符顺序
pop si
pop bx
pop cx
pop ax
ret
reverse:
;名称:revers