概述
汇编语言:将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
i=0∑4Di∗10=(((D4∗10+D3)∗10+D2)∗10+D1)∗10+D0
这就是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,细节很重要。
最后
以上就是优美凉面为你收集整理的汇编语言:将ASCⅡ码表示的十进制数转换为二进制数/十六进制数汇编语言:将ASCⅡ码表示的十进制数转换为二进制数/十六进制数的全部内容,希望文章能够帮你解决汇编语言:将ASCⅡ码表示的十进制数转换为二进制数/十六进制数汇编语言:将ASCⅡ码表示的十进制数转换为二进制数/十六进制数所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复