HeatDeath 2016-04-21 05:42 采纳率: 0%
浏览 2731
已结题

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

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条回答

  • threenewbee 2016-04-21 21:50
    关注
    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?