数字转字符串 基于8086汇编

这篇博客展示了如何使用8086汇编语言将数字转换为字符串。尽管代码实现了所需功能,但作者认为其结构不够理想,存在较多内存交换操作,可能影响代码的移植性。此外,文中提到了一个防止溢出的word型除法实现。
摘要由CSDN通过智能技术生成

这是代码的初稿,功能实现了,但是结构化上面感觉不是太满意,用了较多的内存交换数据的方式,移植性不太好(谁说汇编要可移植的)。重新写了一个防止溢出的除法,被除数是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
实现方式很多,下面提供一种基于x86架构的汇编实现方式。 假设我们要将以下ASCII码数字换为十六进制字符串: ``` input db '12345678' ``` 首先需要准备一个输出缓存区,用于存储换后的十六进制字符串。可以定义如下变量: ``` output db 8 dup (?) ; 存储换后的结果 ``` 接下来就是核心的换代码。下面是一个实现思路: 1. 用 xlat 指令读取 input 中的一个字节。 2. 将读取的字节的高四位右移 4 位,得到对应的十六进制字符。 3. 将读取的字节的低四位与 0x0F 取与运算,得到对应的十六进制字符。 4. 把上述两个十六进制字符分别存储到 output 中。 5. 重复上述过程,直到 input 的末尾。 具体的汇编代码如下: ``` mov si, offset input ; 指向input mov di, offset output ; 指向output mov cx, 8 ;共8个字节 L1: mov al, [si] ; AL = input[i] mov bh, al ; bh暂存高四位 shr al, 4 ; al = input[i] >> 4 call byte [hex_char] ; 换成十六进制字符 mov [di], al ; 存储到output inc di ; output++ mov al, bh ; al恢复原始值 and al, 0x0F ; al = input[i] & 0x0F call byte [hex_char] ; 换成十六进制字符 mov [di], al ; 存储到output inc di ; output++ inc si ; input++ loop L1 ; 循环8次 hexit: ; 将十进制数 0-15 换成十六进制字符 '0'-'F' push ax ; 保存参数 cmp al, 10 jl .less_than_10 ; ax < 10 add al, 'A' - 10 ; ax >= 10, 换成 'A'-'F' jmp .store_char .less_than_10: add al, '0' ; 换成 '0'-'9' .store_char: mov ah, 0 ; 存储到 al 指向的地址 stosb pop ax ; 恢复参数 ret hex_char db 0 ; 为了让 call 指令能够正确调用 hexit ``` 最后,就可以查看存储在 output 中的十六进制字符串了: ``` mov dx, offset output mov ah, 9 int 21h ``` 以上代码中使用了 `call byte [hex_char]` 调用了一个子函数 hexit,用于将十进制数换成十六进制字符。为了让 call 指令能够正确调用 hexit 子函数,需要定义一个跳表 hex_char,并在程序开始处设置正确的跳目标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值