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