我是靠谱客的博主 孝顺芝麻,最近开发中收集的这篇文章主要介绍数字转字符串 基于8086汇编,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

这是代码的初稿,功能实现了,但是结构化上面感觉不是太满意,用了较多的内存交换数据的方式,移植性不太好(谁说汇编要可移植的)。重新写了一个防止溢出的除法,被除数是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汇编所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(71)

评论列表共有 0 条评论

立即
投稿
返回
顶部