以子程序调试的方式,实现从键盘输入一个四位的十六进制数(其中字母为大写),将其 转化为十进制数输出显示。
时间: 2023-06-23 16:10:32 浏览: 91
从键盘输入4位十六进制数,十进制显示
以下是使用汇编语言实现的代码:
```
.model small
.stack 100h
.data
hex_input db 5 ; 存储输入的十六进制数,包括回车和结束符
dec_output dw 0 ; 存储转换后的十进制数
prompt_msg db '请输入一个四位的十六进制数:$'
error_msg db '输入格式错误,请重新输入:$'
newline db 0ah, 0dh, '$'
.code
main proc
mov ax, @data
mov ds, ax ; 初始化数据段寄存器
; 显示提示信息
mov ah, 9
lea dx, prompt_msg
int 21h
get_input:
; 读取用户输入
mov ah, 0ah
lea dx, hex_input
int 21h
; 检查输入格式是否正确
mov al, hex_input+2 ; 检查第三个字符是否为回车
cmp al, 0dh
jne input_error
mov al, hex_input+3 ; 检查第四个字符是否为结束符
cmp al, '$'
jne input_error
; 将十六进制数转换为十进制数
mov ax, 0
mov cx, 4 ; 循环计数器,共需循环四次
convert_loop:
mov bl, hex_input+cx ; 取出一个字符
cmp bl, '0'
jb input_error ; 检查字符是否为数字或字母
cmp bl, '9'
jbe convert_digit ; 如果是数字,跳转到 convert_digit 处
cmp bl, 'A'
jb input_error ; 如果不是大写字母,跳转到 input_error 处
cmp bl, 'F'
ja input_error ; 如果不是大写字母,跳转到 input_error 处
sub bl, 7 ; 将字母 A-F 转换为数字
convert_digit:
xor ah, ah
mov al, bl
shl ax, 4 ; 左移四位,为下一个字符腾出位置
add dec_output, ax ; 将当前字符对应的数值加到 dec_output 中
dec cx
jnz convert_loop ; 如果还有字符,继续循环
; 显示转换后的十进制数
mov ah, 2
mov dl, ' '
int 21h
mov ax, dec_output
call display_number
mov dl, '$'
int 21h
; 程序结束
mov ah, 4ch
int 21h
input_error:
; 显示错误信息并重新输入
mov ah, 9
lea dx, error_msg
int 21h
jmp get_input
; 显示一个十进制数
; 输入参数:AX 中存储需要显示的数值
display_number proc near
push bx
push cx
push dx
; 将 AX 中的数值转换为字符串
xor cx, cx
mov bx, 10
convert_loop:
xor dx, dx
div bx
push dx
inc cx
test ax, ax
jnz convert_loop
; 逐个弹出数字并显示
mov ah, 2
pop_loop:
pop dx
add dl, '0'
int 21h
loop pop_loop
; 恢复寄存器状态并返回
pop dx
pop cx
pop bx
ret
display_number endp
end main
```
该程序首先提示用户输入一个四位的十六进制数,接着读取用户的输入,并检查输入格式是否正确。如果输入格式错误,程序会输出错误信息并要求用户重新输入。如果输入格式正确,程序会将十六进制数转换为十进制数,并显示转换后的结果。
转换过程中,程序逐个取出十六进制数的每个字符,并将其转换为对应的数值。如果字符不是数字或字母,则会输出错误信息并要求用户重新输入。
最后,程序使用一个子程序将转换后的十进制数显示出来。该子程序将十进制数转换为字符串,并逐个输出其中的数字。
阅读全文