微机原理与接口技术——十六进制数转十进制

实验内容:

将键盘输入的十六进制数转换为十进制输出。

实验原理

首先利用dos功能调用,读取输入的两位十六进制的第一位数字,首先判断输入的字符是否在0-9、a-f、A-F之间,如果不在则程序直接退出,如果在则将大写字母减37h,小写字母减57h,数字减30h,然后乘以十六后以二进制的形式暂存在bl当中,同理输入第二位数字,与bl相加,然后判断bl是否大于99,如果大于99,则先除以100将百位数显示出来,同理显示十位和个位数字,如果小于99,则直接除以10显示十位数,然后显示个位数字。

代码附录如下:

code segment
assume cs:code

start:
push ds
sub ax,ax
push ax
mov bx,0
mov dx,0
mov cx,10 ;初始化,设置循环次数为10次

xunhuan:
mov ah,1
int 21h ;读入第一位
cmp al,'0'
jb aa
cmp al,'9'
ja dayu91
sub al,'0' ;减去30H
jmp zhixing

dayu91:
cmp al,'A'
jb aa
cmp al,'F'
ja dayuF1
sub al,37h;减去60H
jmp zhixing

dayuF1:
cmp al,'a'
jb aa
cmp al,'f'
ja aa
sub al,57h;减去60H
jmp zhixing


zhixing:
mov dl,16
mul dl ;乘以16
mov bl,al ;放到bl中

;输入个位数
mov al,0
mov ah,1
int 21h
cmp al,'0'
jb aa
cmp al,'9'
ja dayu92
sub al,'0'
jmp next


dayu92:
cmp al,'A'
jb aa
cmp al,'F'
ja dayuF2
sub al,37h ;减去37H
jmp next



dayuF2:
cmp al,'a'
jb aa
cmp al,'f'
ja aa
sub al,57h ;减去57H
jmp next
aa:
mov ax,4c00h
int 21h



next:
add bl,al ;此时dl中为2进制表示
;以下换行
mov dl,13
mov ah,2
int 21h
mov dl,10
mov ah,2
int 21h


;以下为以10进制形式输出
cmp bl,99    ;如果是三位十进制数显示,跳转
ja sanwei  
mov al,bl      ;如果是两位十进制数显示
mov ah,0
mov cl,10
div cl

mov ch,ah
mov dl,al
add dl,30h
mov ah,02h
int 21h

mov dl,ch
add dl,30h
mov ah,02
int 21h
;以下换行
mov dl,13
mov ah,2
int 21h
mov dl,10
mov ah,2
int 21h

dec cx
jz jieshu
jmp xunhuan


sanwei:
;如果是三位十进制数显示,10进制形式输出
mov al,bl      ;算出百位数
mov ah,0
mov cl,100
div cl
mov dl,al       ;
add dl,30h
mov ch,ah        ;把余数放到ch中
mov ah,02h
int 21h
mov al,ch
mov ah,0
mov cl,10
div cl
mov ch,ah
mov dl,al
add dl,30h
mov ah,02h
int 21h
mov dl,ch
add dl,30h
mov ah,02
int 21h
;以下换行
mov dl,13
mov ah,2
int 21h
mov dl,10
mov ah,2
int 21h

dec cx
jz jieshu
jmp xunhuan


jieshu:
mov ax,4c00h
int 21h
code ends
end start

实验结果:

微机原理与接口技术——十六进制数转十进制_第1张图片
通过观察实验结果可以发现,当输入十六进制数字时,程序将其转化为了十进制数字并显示了出来。

体会与感想

通过本次实验,我学会了如何进行汇编程序的编写,以及熟练掌握汇编语言中的各种基础命令与操作,也十分感慨高级语言的发明是多么厉害的选择,仅仅一个转换进制的程序,用C++仅需要几行就可以编写出来,然而用汇编语言编写却用了一百多行。但也让我对计算机底层如何进行代码实现有了深刻的理解。在实验过程中我遇到了很多问题,比如由于程序代码太长,跳转总是超出范围,需要多跳几次,且汇编语言只能顺序执行,这对程序的编写提升了很大的难度。与此同时,在进行循环操作时,由于在程序中我已经使用了cx的值,导致循环失败,在加入push和pop的压栈出栈命令后,很好的保护了cx的值,使得程序顺利执行。本次实验让我收获匪浅,受益良多。

你可能感兴趣的:(微机原理与接口技术)