文章目录
- 将BX中的无符号数以二进制形式输出
- 将BX中的无符号数以八进制形式输出
- 将BX中的无符号数以十六进制形式输出
- 将BX中的无符号数以十进制形式输出
- 将BX中的有符号数以十进制形式输出
将BX中的无符号数以二进制形式输出
利用移位指令会影响CF,默认dl=30h(数字0),用adc dl,0
加上CF的值,直接用2号功能输出。
data segment
data ends
stack segment stack
dw 100 dup (?)
top label word
stack ends
code segment
assume cs:code,ds:data,ss:stack
main proc far
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
lea sp,top
mov bx,-458 ;1111 1110 0011 0110
mov cx,16 ;bx16位,循环16次
L1:
rol bx,1 ;左边的先显示,循环左移
mov dl,30h ;默认dl显示0
adc dl,0 ;带进位加法
mov ah,2
int 21h
loop L1
mov ah,4ch
int 21h
main endp
code ends
end 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 stack
dw 100 dup (?)
top label word
stack ends
code segment
assume cs:code,ds:data,ss:stack
main proc far
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
lea sp,top
mov bx,-958 ;1111 1100 0100 0010(二进制)/176102(八进制)
rol bx,1 ;第一位直接输出
mov dl,30h ;默认为数字0
adc dl,0
mov ah,2
int 21h
mov cx,5 ;还有5位八进制数
L1:
push cx ;因为bx要循环左移3次,要用到cl,保护cx进栈
mov cl,3 ;bx循环左移3次
rol bx,cl
mov dl,bl ;把bx的低8位放到dl
and dl,7 ;屏蔽高5位
add dl,30h ;转换成数字
mov ah,2 ;显示输出
int 21h
pop cx ;还原cx,继续循环
loop L1
mov ah,4ch
int 21h
main endp
code ends
end 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 stack
dw 100 dup (?)
top label word
stack ends
code segment
assume cs:code,ds:data,ss:stack
main proc far
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
lea sp,top
mov bx,-6908 ;1110 0101 0000 0100(二进制)/E504(十六进制)
mov cx,4
L1:
push cx
mov cl,4
rol bx,cl
mov dl,bl
and dl,0fh ;屏蔽高4位
cmp dl,9
ja L2
add dl,30h ;输出0-9
jmp print
L2:
add dl,37h ;输出A-F
jmp print
print:
mov ah,2
int 21h
pop cx
loop L1
mov ah,4ch
int 21h
main endp
code ends
end main
将BX中的无符号数以十进制形式输出
核心思想:循环(BX)除以10,余数进栈,倒序输出
data segment
data ends
stack segment stack
dw 100 dup (?)
top label word
stack ends
code segment
assume cs:code,ds:data,ss:stack
main proc far
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
lea sp,top
mov bx,65535 ;无符号数bx最大为65535
mov cx,0 ;统计余数的个数
mov si,10 ;想要用(dx,ax)除以10,得先把10放进16位的寄存器si
mov ax,bx ;被除数(dx,ax)
mov dx,0
L1:
div si
push dx ;把余数进栈
inc cx ;余数的个数+1
cmp ax,0 ;判断商是否为0,0退出,否则继续除10
je L2
mov dx,0 ;商在ax,余数在dx,下一次的被除数(dx,ax)要把dx清零
jmp L1
L2:
pop dx ;因为每一次的余数为0-9,只存放在dl,直接pop dx,再用2号功能显示输出
add dl,30h ;转换成数字字符
mov ah,2
int 21h
loop L2
mov ah,4ch
int 21h
main endp
code ends
end main
将BX中的有符号数以十进制形式输出
data segment
data ends
stack segment stack
dw 100 dup (?)
top label word
stack ends
code segment
assume cs:code,ds:data,ss:stack
main proc far
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
lea sp,top
mov bx,-32768
mov cx,0
mov si,10
mov ax,bx
mov dx,0
add ax,0
jns L2 ;符号位为0
neg ax ;符号位为1,求补
L1:
div si
push dx
inc cx
cmp ax,0
je exit1
mov dx,0
jmp L1
L2:
div si
push dx
inc cx
cmp ax,0
je exit2
mov dx,0
jmp L2
exit1:
mov dl,'-'
mov ah,2
int 21h
exit2:
pop dx
add dl,30h
mov ah,2
int 21h
loop exit2
mov ah,4ch
int 21h
main endp
code ends
end main