.model small
.stack 100h
.data
msg1 db 'Input a number: $'
msg2 db 0ah, 0dh, 'BAD INPUT', 0ah, 0dh, '$'
msg3 db 0ah, 0dh, 'Binary is: $'
.code
start:
;段寄存器初始化
mov ax, @data
mov ds, ax
mov ax, @stack
mov ss, ax
;输入提示
mov dx, offset msg1
mov ah, 09h
int 21h
;输入一个数
call GetNumber
push ax
mov ah, 09h
mov dx, offset msg3
int 21h
pop ax
;输出二进制形式
call OutBinary
;程序退出
mov ax, 4c00h
int 21h
;用来得到一个输入的数,以二进制方式存放在AX中
GetNumber proc near
;设定输入的数的范围是0到65535,及0000H-FFFFH由2个字节表示
;可显示字符最多5个,加上回车符6个字符
push bx
push cx
push dx
push si
xor si, si ;si用来记录输入了多少数字,不算H
mov cx, 5 ;最多输入6个字符(算上回车符)
xor bx, bx
@@: xor ax, ax
int 16h;读字符
cmp al, 0dh;回车结束循环
jz PopAndCalculate
push ax
push cx
mov ah, 0ah
mov cx, 1
int 10h;回显字符
mov ah, 03h
int 10h
mov ah, 02h
inc dl
int 10h ;光标向后移动一位
pop cx
pop ax
cmp al, 30h ;比较字符是不是数字或者a到f的ascii码
jb errHandle
cmp al, 39h
ja IsUpcase
sub ax, 30h ;得到对应数字的值
jmp PushToSatck
IsUpcase:
cmp al, 41h ;是不是大写字母A-F
jb errHandle
cmp al, 46h
ja IsH
sub al, 37h
jmp PushToSatck
IsDowncase:
cmp al, 61h ;是不是小写的a-f
jb errHandle
cmp al, 66h
ja Ish2
sub al, 57h
PushToSatck:
push ax
inc si
loop @b
jmp PopAndCalculate
IsH:
cmp al, 48h ;判断是不是大写的H
jnz IsDowncase
jmp ReallyHh
Ish2: cmp al, 68h
jnz errHandle
ReallyHh:
inc ch ;ch设置为1,表示16进制
PopAndCalculate:
xor dx, dx ;dx中存放当前加数和
xor bx, bx ;bx中存放乘的基数
inc bx
@@: test si, si;判断还有多少字符没处理
jz TheEnd
pop ax
anf ax, 00ffh
dec si
push dx
mul bx;将当前取得的数与基数bx相乘
pop dx
add dx, ax
push dx
mov ax, bx
test ch, ch; 判断处理的数是十进制还是十六进制
jz Is10
mov bx, 16
jmp Is16
Is10: mov bx, 10
Is16: mul bx
mov bx, ax
pop dx
jmp @b
errHandle:
@@: test si, si;入栈的出栈
jz @f
pop dx
dec si
jmp @b
@@: lea dx, msg2;输出错误信息
mov ah, 09h
int 21h
xor dx, dx
TheEnd: mov ax, dx
pop si
pop dx
pop cx
pop bx
ret
GetNumber endp
;输出二进制,待输出的数放在AX中
OutBinary proc near
push bx
push cx
push dx
mov bx, ax
mov ah, 02h
mov cx, 16
@@: test bx, 8000h ;取最高位判断是1是0
jz IsZero
mov dl, 31h
jmp IsOne
IsZero: mov dl, 30h
IsOne: int 21h
shl bx, 1 ;将次高位移动到最高位
loop @b
pop dx
pop cx
pop bx
ret
OutBinary endp
end start