汇编:转换功能的实现
要求
完成一个字母或数制之间的转化程序,主程序分别具有 3 种可选择的子功能,按相应的字母(X=>功能 1; Y=>功能 2; Z=>功能 3)可分别进入相应的子功能并在屏幕上显 示结果。3 种可选择的子功能分别为:
(1)实现大写字母向小写字母的转换;
(2)实现十进制数向十六进制数的转换;
(3)实现十六进制数向十进制数的转换。
汇编代码
;-----------------------------------------------------------------------------------------
data segment
info1 db 0dh,0ah,'Please input the Hex:$'
info2 db 0dh,0ah,'Please input the Decimal:$'
info3 db 0dh,0ah,'Please input Big_char:$'
info4 db 0dh,0ah,'The result is:$'
select db 0dh,0ah,'*************************************************'
db 0dh,0ah,'* X: Big_char -> Small_char *'
db 0dh,0ah,'* Y: Decimal -> Hex *'
db 0dh,0ah,'* Z: Hex -> Decimal *'
db 0dh,0ah,'*************************************************'
db 0dh,0ah,'***************************** Please select: $'
info5 db 0dh,0ah,'--- Select --- Error --- Exit ---$'
info6 db 0dh,0ah,'--- Input --- Error ---$'
data ends
;-----------------------------------------------------------------------------------------
code segment
assume ds:data,cs:code
start:
mov ax,data
mov ds,ax
lea dx,select ;显示功能选择
mov ah,09h
int 21h
mov ah,01h ;输入选择
int 21h
cmp al,'X'
jz select1 ;功能1
cmp al,'Y'
jz select2 ;功能2
cmp al,'Z'
jz select3 ;功能3
lea dx,info5 ;输入错误
mov ah,09h
int 21h
jmp over
select1:
call big_small ;功能1子程序
jmp start
select2:
call decimal_hex_1 ;功能2子程序
jmp start
select3:
call hex_decimal_1 ;功能3子程序
jmp start
over:
mov ah,4ch
int 21h
;--------------------------大写字母转化成小写字母--------------------------------------
big_small proc near
mov cl,4
lea dx,info3
mov ah,09h
int 21h
mov ah,01h
int 21h ;输入一个字母
cmp al,41h ;判断是否为大写字母,即是否在A~Z之间
jl error
cmp al,5ah
jg error
xor al,20h ;大小写转换
mov bl,al
mov cl,4
lea dx,info4
mov ah,9
int 21h
mov dl,bl ;显示小写字母
mov ah,02h
int 21h
jmp bs
error:
lea dx,info6 ;显示输入错误
mov ah,09h
int 21h
bs:
ret
big_small endp
;-----------------------------十进制转化为十六进制-----------------------------------
decimal_hex_1 proc near
mov bx,0
mov cx,0
lea dx,info2
mov ah,09h
int 21h
dh1:
mov ah,01h ;输入一个字符
int 21h
sub al,30h ;将字符变成10进制的数,并判断输入的字符是否在0~9中
jl dh3 ;小于0,则输入结束
cmp al,10d
jl dh2 ;小于10则进行保存
jmp error ;否则错误
dh2: ;保存
mov ah,0
mov cx,ax
mov ax,10
mul bx
mov bx,ax
add bx,cx ;输入的十进制数存在bx中
jmp dh1 ;继续输入
dh3:
decimal_hex_2 proc near
lea dx,info4
mov ah,09h
int 21h
mov cx,1000h
call decimal_hex_3
mov cx,100h
call decimal_hex_3
mov cx,10h
call decimal_hex_3
mov cx,1h
call decimal_hex_3
ret
decimal_hex_3 proc near
mov ax,bx ;将bx中保存的输入的十进制数复制给ax
mov dx,0
div cx ;ax/cx
mov bx,dx ;取余数
mov dl,al
cmp dl,10d ;比较是否在0~9之间
jl dh4
add dl,27h ;不在0~9就说明在10~15之间,转换成a~f
dh4:
add dl,30h
mov ah,02h
int 21h
ret
decimal_hex_3 endp
decimal_hex_2 endp
ret
error:
lea dx,info6
mov ah,09h
int 21h
ret
decimal_hex_1 endp
;----------------------十六进制转化为十进制-------------------------------------
hex_decimal_1 proc near
mov bx,0
lea dx,info1
mov ah,09h
int 21h
hd1:
mov ah,01h ;输入一个字符
int 21h
sub al,30h ;将字符变成16进制的数,并判断输入的字符是否在0~9中
jl hd3 ;小于0,则输入结束
cmp al,10d
jl hd2 ;小于10则进行保存,否则继续转换判断
sub al,27h ;将字符变成16进制的数,并判断输入的字符是否在a~f之间
cmp al,0ah
jl error ;错误
cmp al,10h
jl hd2
jmp error
hd2:
mov cl,4
shl bx,cl
mov ah,0
add bx,ax
jmp hd1 ;继续输入
hd3:
hex_decimal_2 proc near
lea dx,info4
mov ah,09h
int 21h
mov cx,10000d
call hex_decimal_3
mov cx,1000d
call hex_decimal_3
mov cx,100d
call hex_decimal_3
mov cx,10d
call hex_decimal_3
mov cx,1d
call hex_decimal_3
ret
hex_decimal_3 proc near
mov ax,bx ;将bx中保存的输入的十进制数复制给ax
mov dx,0
div cx ;ax/cx
mov bx,dx ;取余数
mov dl,al
add dl,30h
mov ah,02h
int 21h
ret
hex_decimal_3 endp
hex_decimal_2 endp
ret
error:
lea dx,info6
mov ah,09h
int 21h
ret
hex_decimal_1 endp
;-----------------------------------------------------------------------------------
code ends
end start