汇编语言:将ASCⅡ码表示的十进制数转换为二进制数/十六进制数

汇编语言:将ASCⅡ码表示的十进制数转换为二进制数/十六进制数

你们好! 这是我的第一个汇编程序的博客,汇编是一个神奇的东西,你深入了解他之后会为他着迷的!!!

题目

将ASCⅡ表示的十进制数字转化为二进制数,例如,默认输入30H,30H,32H,35H,36H,那么程序的最后查看AX寄存器应该是0100。

分析

题目中的30h代表是的十进制0的ASCⅡ码,十进制的数字0-9对应的ASCⅡ码就是30h-39h。而30h,30h,32h,35h,36h,代表的正好是十进制的数字256,也就是28,对应着二进制的0000 0001 0000 0000 ,因为AX寄存器是十六位的,是用十六进制表示的,也就是0010

转换原理

我们以五位十进制数字为例:
1、首先是将五位ASCⅡ码转换为十进制的数字
i = 0 4 D i 10 = ( ( ( D 4 10 + D 3 ) 10 + D 2 ) 10 + D 1 ) 10 + D 0 \sum_{i=0}^4D_i*10=(((D_4*10+D_3)*10+D_2)*10+D_1)*10+D_0
这就是ASCⅡ转换为十进制数字的公式,而计算机寄存器中的数字是用十六进制数字表示的,也就是这时候就已经转换为十六进制数字了。
2、一定要注意,你要搞清楚什么时候使用ASCⅡ值,什么时候使用真值
ASCⅡ:输入和输出时使用的均为ASCⅡ码值
真值:计算的时候使用的为真值,真值就是用ASCⅡ值减去30

sub dl,30h;转换为真值

我们可以用这样的代码转换为真值,同样,使用add命令可以转化为ASCⅡ值。
3、有的人想要把结果按二进制输出,这时候你可以选择循环来实现。我用的是逻辑循环左移,也就是每次都会将最高位循环移动到最低位,每次使用01h与结果,将这一位输出就可以知道这一位是0还是1。输出的方法是使用21h号中断的02h,这个中断会输出dl寄存器中的ASCⅡ码对应的字符。

程序代码

csdn不支持汇编语言,无法高亮显示

	data segment;定义数据段
	org 3500h;数据段从3500h开始存储
	num	db 30h,30h,32h,35h,36h;num首地址为3500h
	data ends
	
	code segment;代码段
	assume cs:code,ds:data;声明代码段地址和数据段地址
	start:
		mov ax,data
		mov ds,ax;将数据存储到内存中
		
		mov cx,4h;循环4次
		mov bx,000ah
		
		mov ah,0;ah必须为0,对应mul指令
		mov si,3500h;可以使用offset num代替3500h
		mov al,[si];将si的数据交给al寄存器
		sub al,30h;获得asc码对应真值,使用真值运算
		mov dh,00h
		
	next1:
		mul bx;此处为ax*bx->dl_ax,所以ah必须为0,否则ah会影响
			  ;当需要转换的十进制数小于65536的时候,
			  ;数据全部存储于ax中
		inc si
		mov dl,[si];取下一位十进制数字
		sub dl,30h;转换为真值
		add ax,dx;dx+ax->ax,dh值已经置零
		loop next1;因为循环前已经处理过第一个数,所以cx为4
		
		mov cx,10h;此处是十六进制,cx循环10次
		mov bx,ax
		
	next2:
		rol bx,1;逻辑循环左移
		mov dl,bl
		and dl,01h;确定最低位为0还是1
		add dl,30h;将最低位转换为asc码输出
		mov ah,02h
		int 21h
		loop next2;共循环16次
		
		mov ah,4ch
		int 21h
	code ends
		end start

运行环境

使用的运行环境为DOSBOX0.74版本,这是我有史以来感觉最容易搞定的编译环境,编译环境的安装我就不在赘述了。

代码运行过程

1、首先建立**.asm文件
2、汇编语言运行的代码过程需要
masm进行汇编
3、汇编无误之后要进行
link链接
4、链接无误会产生
.exe文件,重点来了,你可以直接运行此可执行文件会输出0000 0001 0000 0000**,如果你想要查看ax寄存器,那么你需要在第二次循环之前查看。

查看ax值

-u指令进行反汇编,查看汇编代码对应的指令值
在这里插入图片描述
-g27执行到第二次循环开始之前,可以查看此时的寄存器的值
在这里插入图片描述

代码运行细节

1、loop为直到型循环,所以需要循环几次,你的cx值就设为几。本代码第一次循环因为在进入循环之前已经处理过一次,所以只需要循环4次,即cx=4。第二次循环需要循环16次,因此cx=10h。
2、有时候我们只需要使用低八位寄存器来获得数据,但是在运算过程中我们会涉及到高位的寄存器,很有可能会影响我们的运算结果。所以在某些细节上面需要把高位寄存器置0,就像本程序中某些情况下的ah和dh,细节很重要。

发布了17 篇原创文章 · 获赞 16 · 访问量 1189

猜你喜欢

转载自blog.csdn.net/XYshaonianhaofang/article/details/103017153