概述
这是代码的初稿,功能实现了,但是结构化上面感觉不是太满意,用了较多的内存交换数据的方式,移植性不太好(谁说汇编要可移植的)。重新写了一个防止溢出的除法,被除数是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:
;名称:reverse
;功能:将内存区一段字节逆序
;参数:
;返回:
push bx
push ax
push cx
push si
mov bx,0
mov ax,ds:[3]
mov cl,2
div cl
mov cl,al
mov ch,0
s1:
mov al,[bx+16]
mov ah,[si+16]
mov [bx+16],ah
mov [si+16],al
inc bx
dec si
loop s1
pop si
pop cx
pop ax
pop bx
ret
;reverse子程序到此结束
divw:
;名称:divw
;功能:进行不会产生溢出的除法运算,
; 被除数为word型,除数为byte
; 型,结果为word型。
;参数:(ax)=word型数据的16位
; (cl)=除数
;返回:(ah)=结果的高8位
; (al)=结果的低8位
; (cl)=余数
push ax
push dx
push cx
push bx
push si
mov dh,ah ;被除数高8位
mov dl,al ;被除数低8位
mov al,ah ;计算H/N
mov ah,0
mov cl,bl ;参数传递?
div cl ;(ah)=余数,(al)=商
mov bl,al ;bl暂存计算结果的商
mov al,dl
div cl
mov cl,ah ;保存余数
mov ah,bl ;商高位
mov ds:[0],ax ;向内存输出结果
mov ds:[2],cl
divw_ok:
pop si
pop bx
pop cx
pop dx
pop ax
ret
;divw子程序到此结束
code ends
end start
最后
以上就是孝顺芝麻为你收集整理的数字转字符串 基于8086汇编的全部内容,希望文章能够帮你解决数字转字符串 基于8086汇编所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复