汇编实验10-3 数值显示

代码及注释:

;本程序意图为设计一个子程序实现内存中二进制数转化为10进制数并且显示在屏幕上
;程序描述:
;将数据12666以十进制的形式显示在屏幕的8行3列,用绿色显示出来。
;在显示时调用本实验中第一个字程序show_str
;提示:
;要将内存中保存的”12666”(内存中以二进制形式保存)转化为显示在屏幕上的字
;串”12666”需要经过一定的转换,具体操作就是将12666除以10取余,当商为0时
;则表示已经转换完,十进制对应的ASCII码就是十进制数码加上30h
;比如6对应的就是ASCII码36h
assume cs:code,ds:data,ss:stack

data segment
	db 16 dup (10)		;因为所操作的数为12666。将其转化为对应字符串的ASCII后5个字
					;节,加上以0为结束一共6个字节
data ends

stack segment
	db 16 dup (10)		;我写的程序中使用了栈,故开辟一段空间存放数据
stack ends

code segment
start:
	mov ax,12666
	mov bx,data
	mov ds,bx	
	mov bx,stack
	mov ss,bx		
	mov sp,16	;初始化ds及ss
	mov si,0
	call dtoc

	mov dh,8
	mov dl,3
	moc cl,2
	call show_str		;定义字符显示位置及属性,调用子程序
	
	mov ax,4c00h
	int 21h

dtoc:
	mov di,0
	mov bx,10
  s: mov dx,0
	div bx	;因为12666第一次除以10为1266不能使用16位/8位的除法形式,因为al
			;中最大只能保存255
	mov cx,ax
	push dx
	inc di
	jcxz ok	;因为当商为0时表示对应的转换已经完成,所以使用cx储存除法的结果,
			;并且使用jcxz指令跳转到处理完转换后的程序
			;inc di作用为记录入栈数据的个数,后面程序会要用这个作为循环条件以及
			;将字符串都保存到data段后可以再分配0到字符串后面作为结束标志
			;将数据入栈的原因为用除法取余时十进制的出现是从最低位一直到最高位的
			;比如“12666”对应的余数分别是6、6、6、2、1入栈后在出栈刚好可以实现
			;以12666形式保存在data中
	jmp s

ok:
	mov cx,di
lp:
	pop ax
	add al,30h
	mov [si],al
	inc si
	loop lp	;将di中保存的数据(余数的个数)传递给cx。并且将其中的余数转化为对应
			;的十进制ASCII码,循环作用为将这些以转换完的数据存入data中
	mov byte ptr [di],0
	ret

show_str:
	push dx
	push cx
	push ax
	push si

	mov ax,0800h
	mov es,ax
	mov si,0
	mov al,0a0h
	mul dh
	mov bx,ax
	mov al,2
	mov ah,0
	mul dl
	add bx,ax
	
	mov ch,0
	mov di,cx
s0: mov cl,[si]
	mov ch,0
	jcxz ha
	mov es:[bx],cl
	mov es:[bx+1],di
	inc si
	inc bx
	inc bx
	jmp s0

ha:
	pop si
	pop ax
	pop cx
	pop dx
	ret
code ends
end start


代码截图及运行结果:


小结:

这....花了我大半个晚上

还好写出来了,不然睡不着了

这一个小小的转换居然这么费心思,可能是我思路有问题把,但是独立完成的感觉很好

原以为做完这三个就结束了,没想到后面还有一个课程设计....看看都有点怕啊

必要的注释都写在上面了

加油吧

发布了126 篇原创文章 · 获赞 15 · 访问量 8万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章