文章目录
- 将BX中的无符号数以二进制形式输出
- 将BX中的无符号数以八进制形式输出
- 将BX中的无符号数以十六进制形式输出
- 将BX中的无符号数以十进制形式输出
- 将BX中的有符号数以十进制形式输出
将BX中的无符号数以二进制形式输出
利用移位指令会影响CF,默认dl=30h(数字0),用adc dl,0
加上CF的值,直接用2号功能输出。
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 bx,-458 ;1111 1110 0011 0110mov cx,16 ;bx16位,循环16次
L1: rol bx,1 ;左边的先显示,循环左移mov dl,30h ;默认dl显示0adc dl,0 ;带进位加法mov ah,2int 21hloop L1mov ah,4chint 21h
main endp
code endsend main
将BX中的无符号数以八进制形式输出
二进制转换成八进制:
从低到高,3位二进制转换成1位八进制
bx为16位,能转换成6位8进制:最高位0/1+5位8进制。
还是利用移位指令ROL,先把最高位移出,直接输出;
循环5次,每次ROL3位,把bx的最高3位移到最低3位,取出bl,屏蔽bl的高5位,显示输出。
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 bx,-958 ;1111 1100 0100 0010(二进制)/176102(八进制)rol bx,1 ;第一位直接输出 mov dl,30h ;默认为数字0adc dl,0mov ah,2int 21hmov cx,5 ;还有5位八进制数
L1:push cx ;因为bx要循环左移3次,要用到cl,保护cx进栈mov cl,3 ;bx循环左移3次rol bx,clmov dl,bl ;把bx的低8位放到dland dl,7 ;屏蔽高5位add dl,30h ;转换成数字mov ah,2 ;显示输出int 21hpop cx ;还原cx,继续循环loop L1mov ah,4chint 21h
main endp
code endsend main
将BX中的无符号数以十六进制形式输出
跟八进制同理,十六进制输出要注意:0-9和A-F的输出
显示0-9,在原来的基础上+30H
10/0AH,要输出A/41H/65 ———— 二者相差65-10=55=37H
显示A-F,在原来的基础上+37H
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 bx,-6908 ;1110 0101 0000 0100(二进制)/E504(十六进制)mov cx,4
L1:push cxmov cl,4rol bx,clmov dl,bland dl,0fh ;屏蔽高4位cmp dl,9ja L2add dl,30h ;输出0-9jmp printL2:add dl,37h ;输出A-Fjmp printprint:mov ah,2int 21hpop cxloop L1mov ah,4chint 21h
main endp
code endsend main
将BX中的无符号数以十进制形式输出
核心思想:循环(BX)除以10,余数进栈,倒序输出
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 bx,65535 ;无符号数bx最大为65535mov cx,0 ;统计余数的个数mov si,10 ;想要用(dx,ax)除以10,得先把10放进16位的寄存器simov ax,bx ;被除数(dx,ax)mov dx,0
L1:div sipush dx ;把余数进栈inc cx ;余数的个数+1cmp ax,0 ;判断商是否为0,0退出,否则继续除10je L2mov dx,0 ;商在ax,余数在dx,下一次的被除数(dx,ax)要把dx清零jmp L1L2:pop dx ;因为每一次的余数为0-9,只存放在dl,直接pop dx,再用2号功能显示输出add dl,30h ;转换成数字字符mov ah,2int 21hloop L2mov ah,4chint 21hmain endp
code endsend main
将BX中的有符号数以十进制形式输出
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 bx,-32768mov cx,0mov si,10mov ax,bxmov dx,0add ax,0jns L2 ;符号位为0neg ax ;符号位为1,求补
L1:div sipush dxinc cxcmp ax,0je exit1mov dx,0jmp L1L2:div sipush dxinc cxcmp ax,0je exit2mov dx,0jmp L2exit1:mov dl,'-'mov ah,2int 21hexit2: pop dxadd dl,30hmov ah,2int 21hloop exit2mov ah,4chint 21h
main endp
code endsend main