文章目录
- 输入5位以内的八进制数,存入BX中
- 输入6位以内的八进制数,存入BX中
输入5位以内的八进制数,存入BX中
bx为16位的寄存器。
5位以内的八进制数最多是15位二进制,bx最高位默认为0,不输出
只输出bx的5位8进制数
data segment
data ends
stack segment stackdw 100 dup (?)top label word
stack ends
code segmentassume cs:code,ds:data,ss:stack
main proc farmov ax,datamov ds,axmov ax,stackmov ss,axlea sp,topmov cx,0 ;统计输入的合法字符mov si,8mov bx,0
L1: mov ah,7 ;不回显int 21hcmp al,0dh ;输入回车,跳转到以8进制输出bxje printcmp al,30hjb L1cmp al,37hja L1mov dl,al ;合法字符,输出mov ah,2int 21hinc cx ;合法字符+1;将输入字符转化成8进制,跟转化成10进制类似;10进制bx*10+输入的字符;8进制bx*8+输入的字符;由于乘法指令mul默认在ax,记得要交换ax,bxmov al,dland ax,7 ;屏蔽高13位xchg ax,bx ;交换ax,bxmul siadd bx,axcmp cx,5 ;判断输入的合法字符数,cx=5跳转到以8进制输出bx,否则继续输入je printjmp L1;bx以8进制输出
print:cmp cx,0 ;合法字符数为0,退出je exitmov dl,0dh ;回车mov ah,2int 21hmov dl,0ah ;换行mov ah,2int 21hmov cx,5 ;输出低15位对应的5位8进制rol bx,1 ;输入了5位8进制,即5*3=15位二进制;输出5位8进制的时候记得把最高位移走再进入循环
L2: push cxmov cl,3rol bx,clmov dl,bland dl,7 ;屏蔽高5位add dl,30h ;转换成数字字符mov ah,2int 21hpop cxloop L2exit:mov ah,4chint 21h
main endp
code endsend main
输入6位以内的八进制数,存入BX中
bx想要存6位8进制数,最高位只能是0或1,输入其他情况以溢出处理。
data segmentstring db 0ah,0dh,"overflow!",'$'
data ends
stack segment stackdw 100 dup (?)top label word
stack ends
code segmentassume cs:code,ds:data,ss:stack
main proc farmov ax,datamov ds,axmov ax,stackmov ss,axlea sp,topmov bx,0mov si,8mov cx,0
L1: mov ah,7int 21hcmp al,0dhje printcmp al,30hjb L1cmp al,37hja L1mov dl,almov ah,2int 21hinc cxmov al,dland ax,7xchg ax,bxmul sijc overflow ;乘法溢出,(dx,ax)高16位不为0,即ax*8超出了16位的范围add bx,axjc overflow ;加法溢出,bx+ax有进位,出了16位的范围cmp cx,6 ;最多输入6个合法字符je printjmp L1;输出bx中的6位8进制
print:cmp cx,0je exitmov dl,0ahmov ah,2int 21hmov dl,0dhmov ah,2int 21hrol bx,1 ;最高位为0/1,直接循环左移1位输出mov dl,bland dl,1 ;屏蔽高7位add dl,30h ;转换成数字字符mov ah,2int 21hmov cx,5 ;接下来输出5位8进制
L2: push cxmov cl,3rol bx,clmov dl,bland dl,7 ;屏蔽高5位add dl,30h ;转换成数字字符mov ah,2int 21hpop cxloop L2jcxz exit ;跳过下面的overflowoverflow:lea dx,stringmov ah,9int 21hexit:mov ah,4chint 21h
main endp
code endsend main