2 heatdeath HeatDeath 于 2016.04.21 13:42 提问

汇编将输入的十进制数字转换成二进制,八进制,十六进制,代码写出来了,但是却无法正常运行 1C

data segment
mesg db 'please input :',0ah,0dh,'$'
buf db 5
db ?
db 5 dup(?)
buf1 db 5 dup('0')
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
lea dx,mesg ;在屏幕上显示mesg标号后的内容
mov ah,9
int 21h

mov bx,10

lea dx,buf  ;从键盘输入一个字符到缓冲区
mov ah,0ah
int 21h

mov si,offset buf+2 
mov di,offset buf1
mov cl,buf+1    ;将实际输入字符个数送入cl中

aga:
mov al,[si] ;将输入的第一个字符对应的ASCII码送入al中
sub al,30h ;获得输入的第一个数的原值
mov ah,0
xchg ax,[di]

mul bx

xchg [di],ax
add [di],ax
inc si
loop aga
mov bx,[di]
mov dl,0ah
mov ax,2
int 21h
mov dl,0dh
int 21h
mov cx,16
last:
mov dl,'0'
rol bx,1
jnc next ;与cf标志有关,若不进位,即cf=0,则跳转
mov dl,'1'
next:
mov ah,2 ;显示dl中的字符
int 21h
loop last
mov ah,2
mov dl,0ah
int 21h
mov dl,0dh
int 21h ;换行
mov cx,4
aga2:
push cx
mov cl,4
rol bx,cl ;将bh的高4位循环左移入al的低4位中
pop cx
mov dx,bx
and dl,0fh ;将dl的高4位清零,保留dl的低4位,即bh中的高4位
cmp dl,10
jc then ;进位则跳转,即dl小于10
add dl,7
then:
add dl,30h
mov ah,2
int 21h
loop aga2
mov dl,0ah
int 21h
mov dl,0dh
int 21h ;换行

;========================转换为8进制==============================
mov dl,'1' ;假设bx=1100 0000 0000 0000
rol bx,1 ;逻辑循环左移则产生进位
jc then1 ;产生进位后则跳转到then1,显示8进制第一位为1
mov dl,'0' ;未产生进位,则第一位显示0
then1:
mov ah,2
int 21h
mov cx,5 ;(16-1)/3=5,3个二进制数表示一个八进制数
aga3:
push cx
mov cl,3
rol bx,cl ;循环左移3位
pop cx
mov dx,bx
and dl,07h ;07h=0000 0111b,将dl的高4位清零,低4位的第一位清零
add dl,30h
mov ah,2
int 21h
loop aga3

mov ah,4ch
int 21h

code ends
end start


不知道错误在哪里...
还请大神指教

1个回答

caozhy
caozhy   Ds   Rxr 2016.04.22 05:50
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!