汇编中怎么将十进制数转换为十六进制
发布网友
发布时间:2022-05-02 13:36
我来回答
共1个回答
热心网友
时间:2022-06-20 07:17
assume cs:code, ds:data
data segment
num dw 0
ten dw 10
tmp dw 0
buffer db 256 p(?)
data ends
code segment
start: mov ax, data
mov ds, ax
call input ; 输入
call crlf ; 输出一个换行
lea bx, buffer ; bx为存储地址
mov ax, num
call d2b ; 10进制到2进制转换
mov ah, 9 ; 输出
mov dx, bx
int 21h
call crlf ; 输出一个换行
mov ax, num
call d2h ; 10进制到16进制转换
mov ah, 9
mov dx, bx
int 21h
mov ax, 4c00h
int 21h
input: finit ; 输入过程,结果保存在num里
fldz
_1L1: mov ah, 1
int 21h
cmp al, 13
jz done1
xor ah, ah
sub al, '0'
mov tmp, ax
fimul ten
fiadd tmp
jmp _1L1
done1: fistp num
ret
d2b: xor si, si ; 10进制到2进制转换
xor di, di
mov dx, 8000h
jmp _2L2
_upd1: inc si
_2L1: shr dx, 1
jz done2
_2L2: test dx, ax
jnz _2ones
cmp di, 0
jz _2L1
mov byte ptr [bx+si], '0'
jmp _upd1
_2ones: mov byte ptr [bx+si], '1'
mov di, 1
jmp _upd1
done2: cmp si, 0
jg _2L4
mov byte ptr [bx+si], '0'
inc si
_2L4: mov byte ptr [bx+si], 'B'
mov byte ptr [bx+si+1], '$'
ret
d2h: mov cl, 4 ; 10进制到16进制转换
xor si, si
xor di, di
jmp _3L3
_3L1: inc si
_3L2: shl ax, cl
jz done3
_3L3: mov dx, ax
and dx, 0f000h
rol dx, cl
cmp di, 0
jnz _3L4
cmp dx, 0
jz _3L2
mov di, 1
_3L4:
cmp dx, 10
jge _3acs
add dl, '0'
mov [bx+si], dl
jmp _3L1
_3acs: sub dx, 10
add dx, 'A'
mov [bx+si], dl
jmp _3L1
done3: cmp si, 0
jg _3L5
mov byte ptr [bx+si], '0'
inc si
_3L5:
mov byte ptr [bx+si], 'H'
mov byte ptr [bx+si+1], '$'
ret
crlf: mov ah, 2 ; 输出一个回车
mov dl, 13
int 21h
mov dl, 10
int 21h
ret
code ends
end start