使用dosbox编程实现十六进制转换为十进制数。(至少实现4位十六进制数转换)从键盘输入一个十六进制数,转换为十进制数,显示出来。要求:需要检测输入一个规范的十六进制数
时间: 2024-02-24 19:53:21 浏览: 115
十六进制转换成十进制
5星 · 资源好评率100%
好的,以下是使用dosbox编程实现十六进制转换为十进制数的示例代码:
```
.model small
.stack 100h
.data
hexstr db 5 dup('$') ; 存储输入的十六进制数
decnum dw 0 ; 存储转换后的十进制数
.code
main proc
mov ax, @data
mov ds, ax ; 初始化数据段寄存器
; 读取输入的十六进制数
mov ah, 0Ah
lea dx, hexstr
int 21h
; 检查输入的十六进制数是否合法
mov si, offset hexstr+2 ; 跳过输入缓冲区头部
mov cx, 4 ; 最多只能输入4位十六进制数
check:
cmp byte ptr [si], '$'
je convert ; 如果已经到输入缓冲区的末尾,跳转到转换过程
cmp byte ptr [si], '0'
jl invalid ; 如果输入的字符小于 '0',不合法
cmp byte ptr [si], '9'
jbe next ; 如果输入的字符在 '0' 到 '9' 之间,继续检查下一位
cmp byte ptr [si], 'A'
jl invalid ; 如果输入的字符小于 'A',不合法
cmp byte ptr [si], 'F'
jle next ; 如果输入的字符在 'A' 到 'F' 之间,继续检查下一位
invalid:
mov ah, 09h
lea dx, errormsg
int 21h ; 提示输入的十六进制数不合法
mov ax, 4C00h
int 21h ; 程序退出
next:
inc si
loop check
; 将十六进制数转换为十进制数
convert:
mov si, offset hexstr+2 ; 跳过输入缓冲区头部
mov cx, 4 ; 最多只能输入4位十六进制数
mov bx, 1 ; 计算权值时的基数
mov decnum, 0 ; 初始化十进制数
convert_loop:
mov al, byte ptr [si]
sub al, '0' ; 将字符转换为数字
cmp al, 9
jbe convert_next ; 如果是数字,跳过转换
sub al, 7h ; 如果是字母,将其转换为数字
convert_next:
mul bx ; 计算权值
add decnum, ax ; 加上当前位的值
mov ax, decnum
mov bx, 10 ; 下一位的权值为 10
inc si
loop convert_loop
; 显示转换后的十进制数
mov ah, 02h
mov dl, ' '
int 21h ; 显示一个空格
mov ax, decnum
call display_num ; 调用显示数字的子程序
mov ah, 4Ch
int 21h ; 程序退出
; 显示数字的子程序
display_num proc near
push ax
push bx
push cx
push dx
mov bx, 10 ; 要显示的十进制数
mov cx, 0 ; 位数计数器
convert_loop:
xor dx, dx ; 清零 dx
div bx ; ax/bx,商在 al,余数在 dx
push dx ; 将余数压入堆栈
inc cx ; 位数加 1
cmp ax, 0 ; 如果商为 0,说明已经转换完毕
jne convert_loop
display_loop:
pop dx ; 弹出一个余数
add dl, '0' ; 将数字转换为字符
mov ah, 02h
int 21h ; 显示字符
loop display_loop
pop dx
pop cx
pop bx
pop ax
ret
display_num endp
; 错误提示信息
errormsg db 'Invalid hex number!', 0Dh, 0Ah, '$'
main endp
end main
```
说明:上述代码通过读取键盘输入的十六进制数,并检查其是否合法,然后将其转换为十进制数并显示出来。如果输入的十六进制数不合法,程序会提示错误信息并退出。
阅读全文