王爽汇编语言第十章数值显示问题(将数值转换为字符串输出)

文章介绍了一个使用汇编语言的程序,演示了如何将32位数值转换为字符串并在屏幕上显示,同时提到了代码的优化需求。涉及函数包括数值转换、除法运算和字符串显示。
摘要由CSDN通过智能技术生成

效果图如图:

代码如下:还不够精简,有空优化一下

assume cs:code,ds:data
data segment
	dw 123,12666,1,8,3,38
	db 32 dup(0);存储字符串
data ends
stack segment
	db 32 dup(0)
stack ends
code segment
start:	mov ax,data
		mov ds,ax
		mov ax,stack
		mov ss,ax
		mov sp,32
		;重复处理data中内容6次,注意结尾要加0
		mov cx,6
		mov si,12;存入内存的偏移地址
		mov bx,0;记录取出数字的位置
		
		s:	mov ax,[bx]
			call dtoc
			;在末尾加个,
			mov ax,','
			mov [si],ax
			inc si
			add bx,2
			loop s
		
		;在最后的结尾加0,以确保后续可以显示
		sub si,1
		mov ax,0
		mov [si],ax
		
		;显示字符串
		mov dh,8
		mov dl,3
		mov cl,0c9h
		mov di,12
		call show_str
		
		mov ax,4c00h
		int 21h
		
		;名称:dtoc
		;功能:将ax中的数值转换为字符串形式写入ds:si空间中
		;参数:(ax)=待转换数值 (si)=写入ds中的偏移地址
		;返回值:无
		dtoc:	;将ax中的数与10相除,取余数加30h写入[si],直到商为0
				;1.保存数据
					push dx
					push cx
					push bx
				;2.操作
					mov bx,0;记录有几个
					s0:	;除10
						mov dx,0;高位
						mov cx,10;除数
						call divdw
						add cx,30h
						push cx;余数入栈
						inc bx
						;若商为0,则跳出
						mov cx,ax
						jcxz ok0
						jmp short s0
					;写入数据
					ok0:mov cx,bx
					s2: pop ax
						mov [si],ax
						inc si
						loop s2
				;3.还原数据
						pop bx
						pop cx
						pop dx
						ret
	
		;名称:divdw
		;功能:实现32位除以16位且不会溢出
		;参数:dx=高16位 ax=低16位 cx=除数
		;返回:dx=结果的高16位 ax=结果的低16位 cx=余数
		divdw:	;计算int(H/N)*65536
				push bx	;储存好bx的值
				push ax
				;计算第一部分
				mov ax,dx
				mov dx,0
				div cx
				;计算第二部分
				pop bx
				push ax
				mov ax,bx
				div cx
				mov cx,dx
				pop dx
				pop bx;还原bx
				ret
		
		;名称:show_str
		;功能:在指定的位置,用指定的颜色,显示一个用0结尾的字符串(在ds:di中)
		;参数:(dh)=行号(取值范围0-24) (dl)=列号(取值范围0-79) (cl)=颜色(具体取值翻看五彩字部分)(di)=字符串在ds中的偏移地址
		;返回:无
		show_str:	;保存需要用的寄存器
					push dx
					push cx
					push bx
					push si
					push di
					push ax
					push es
					;功能实现
					mov ax,0b800h
					mov es,ax
					mov al,160
					mul dh
					mov bx,ax ;bx为行地址
					mov al,2
					mul dl
					mov si,ax ;si为列地址
					;mov di,0 ;di为目前取到字符串的哪个位置
					mov dl,cl ;用dl存放颜色
					mov ch,0
					s1:	mov cl,[di]
						inc di
						jcxz ok1
						mov ah,dl
						mov al,cl
						mov es:[bx+si],ax
						add si,2
						loop s1
					;还原寄存器
					ok1:	pop es
						pop ax
						pop di
						pop si
						pop bx
						pop cx
						pop dx
						ret
code ends
end start

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值