data
segmentstr
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次
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
网上别人写的