如何把十进制转化为十六进制 汇编语言

从键盘输入一个4位以内的10进制数字字符串,转换成16进制形式输出。
如,输入:1234 输出:4D2
PS。这个题目很重要,希望各位高手出手相助,如何有时间解释一下,那更好,如果没时间,给个答案我自己研究也行。最好是自己做的,不要网上抄袭,拜托了各位

data segment
str db 0ah,0dh
num db 4 dup(?),'H$'
tab db '0123456789ABCDEF'
data ends
code segment
assume cs:code,ds:data
begin: mov ax,data
mov ds,ax ;初始化代码段
xor bx,bx
mov cx,10 ;进制
next: mov ah,1
int 21h
cmp al,0dh
jz conv ;如果是回车,表示输入结束,转换开始
push ax ;保存输入值,当然还有AH,因为堆栈的存取必须以字为单位
mov ax,bx
mul cx
mov bx,ax ;将先前的结果向上推一位
pop ax ;取回本次输入
and al,0fh ;屏蔽掉无用位,类SUB AL,30H
xor ah,ah ;高位归零
add bx,ax ;合并本次输入
jmp next
conv: mov ax,bx ;开始转换
mov ch,4
lea bx,tab ;没有见这个直接定址表起什么用啊!!!
mov cl,4
lea si,num
lopa: rol ax,cl ;把高4位移到低4位
push ax
and ax,000fh ;取出低4位
mov [si],al ;按地址由低到高的顺序将结果由高到底存放
inc si
pop ax
dec ch
jnz lopa
lea dx,str
mov ah,9
int 21h ;回车换行
mov ah,4ch
int 21h
code ends
end begin
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;算法描述:
;总体来说是以二进制为中介,
;先将输入视为十进制,转换为二进制数保存在BX中
;然后再将这个二进制数转换为十六进制数保存在num开始的单元中
;十进制转换为二进制的过程:
;初始化:假设第一次输入前的输入为0
;对于每次输入,将前面输入的各位均提升一位,即百位变千位,十位变百位,个位变十位,然后当前的输入填到个位,重复该步操作直到遇到回车符
;二进制转换为十六进制:
;因为每4个二进制位可以由1个十六进制位表示,所以依次取出4个二进制位就可以
;①每次循环移动4位,将高4位移动到低4位后,取出低4位
;②将取出的数依次写入num开始的单元中
;③重复①-②4次
;输出时:(这段代码没有,所以我说,没有见直接定址表起什么用)
;从num开始以字节为单位取数
;以得到的数字为偏移量,查表tab,得到对应的十六进制字符,输出,重复4次
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2016-08-24
code segment
assume cs:code
main proc far
;
repeat:
call read
call crlf
call change
call crlf
jmp repeat
main endp

;

read proc near

mov bx, 0
newchar:
mov ah, 1
int 21h
sub al, 30h
jl exit
cmp al, 9d
jg exit
cbw
;
xchg ax, bx
mov cx, 10d
mul cx
xchg bx, ax
add bx, ax
jmp newchar
exit:
ret
read endp

;

change proc near

mov ch, 4
for:
mov cl, 4
rol bx, cl
mov al, bl
and al, 0fh
add al, 30h
cmp al, 3ah
jl print
add al, 07h
print:
mov dl, al
mov ah, 02h
int 21h
dec ch
jnz for
change endp

crlf proc near

mov dl, 0dh
mov ah, 2
int 21h
mov dl, 0ah
mov ah, 2
int 21h
ret
crlf endp
code ends
end main
第2个回答  2010-01-19
CODE SEGMENT
ASSUME CS:CODE
BEGIN:
XOR BX,BX
L1: MOV AH,1
INT 21H
CMP AL,0DH
JE L2
CMP AL,30H
JB L1
CMP AL,39H
JA L1
AND AX,0FH
XCHG AX,BX
MOV CX,10
MUL CX
JC L5
ADD BX,AX
JC L5
JMP L1
L2: MOV AH,2
MOV DL,0DH
INT 21H
MOV AH,2
MOV DL,0AH
INT 21H
MOV CX,4
L3:
PUSH CX
MOV CL,4
ROL BX,CL
MOV DL,BL
AND DL,0FH
ADD DL,30H
CMP DL,39H
JBE L4
ADD DL,7
L4: MOV AH,2
INT 21H
POP CX
LOOP L3
JMP L6
L5:MOV AH,9
LEA DX,ERROR
INT 21H
L6:MOV AH,4CH
INT 21H
ERROR DB 0DH,0AH,"0VERFLOW",07,0DH,0AH,24H
CODE ENDS
END BEGIN

PS:楼主慢慢研究 :)
相似回答