十进制ascii码转换成二进制子程序

  • 格式:docx
  • 大小:20.24 KB
  • 文档页数:6

1.将ASCII码表示的十进制数转换为二进制数
十进制数可以表示为:Dn×10n+Dn-1×10n-1+…+D0×100
=Di×10i 其中Di代表十进制数1、2、3…9、0。

上式可以转换为:
ΣDi×10i=((…(Dn×10+Dn-1)×10)+Dn-2)×10+…+D1)×10+D0
由上式可归纳十进制数转换为二进制的方法:从十进制数的最高位Dn开始作乘10加次位的操作,依次类推,则可求出二进制数结果。

本实验要求将缓冲区中的一个五位十进制数00012的ASCII码转换成二进制数,并将转换结果按位显示在屏幕上。

;***********************************************************************
data SEGMENT ;定义数据段
msg DB ' hua xian asks you to input ASCLL numbers:$'
msg2 DB 0DH,0AH,'OverFlow!!$',0DH,0AH
msg3 DB 0DH,0AH,'The Binary number:$'
array DW 100 dup(0)
TEN DW 10
TAB DB 4
data ENDS
;***********************************************************************
STACK SEGMENT PARA STACK ;定义堆栈段
DW 64 DUP(?)
STACK ENDS
;***********************************************************************
code SEGMENT ;定义代码段
;-------------------------------------------------------------------MAIN PROC FAR
ASSUME CS:code,DS:data,SS:STACK
MOV AX,data ;data送到DS中
MOV DS,AX
LEA DX,msg ;输出要求
MOV AH,9H
INT 21H
LEA BX,array ;array数组的地址传送到BX中
SUB CX,CX;使CX= 0
CALL INPUT ;调用INPUT子程序
CALL CONVERT ;调用CONVERT子程序
PUSH AX;保护AX中的数据因为AX中的数据有用,但在此后又;必须用到ax LEA DX,msg3 ;输出“The Binary number:”
MOV AH,9H ;
INT 21H ;中断
POP AX;返回受保护的AX中的数据
CALL DISPLAY ;输出二进制数
OUT0:
MOV AX,4C00h ;返回 DOS
INT 21h
MAIN ENDP
;-------------------------------------------------------------------
INPUT PROC NEAR
WAIT_HERE:
MOV AH,7 ;等待输入
INT 21H
CMP AL,0DH ;是否是回车键
JE OUT1 ;如果是则跳转道OUT1否则继续执行
CMP AL,'0';AL<'0'?
JL WAIT_HERE ;如果是则跳转到WAIT_HERE否则继续执行
CMP AL,'9';AL>'9'?
JG WAIT_HERE ;如果是则跳转到WAIT_HERE否则继续执行
MOV[BX],AL;把键盘输入的数字送到array[bx]中
ADD BX,2 ;增加bx的值,能够使得下一个数存放到array 数组中的下;一个位置,因为是字节型所以加2
INC CX;增加计数器的值
MOV AH,2H ;输出刚刚输入的数字,若不是数字则永远不会到此步
MOV DL,AL;dl中存放要显示的值
INT 21H ;中断
JMP WAIT_HERE ;显示完后跳转到WAIT_HERE
OUT1:
ret;退出次过程
INPUT ENDP
;-----------------------------------------------------------------CONVERT PROC NEAR
SUB CX,1 ;计数器减1
LEA BX,array ;bx为array数组的首地址
MOV AX,[BX];把数组中的值送到ax中
SUB AX,30H ;减30h是将ascll码转换为十进制数
CMP CX,0 ;如果仅仅输入了一个数字则跳出
JE OUT3
LOOP1:;否则就开始运行
MUL TEN ;把刚才的十进制数*10,再加下一位数
ADD BX,2
ADD AX,[BX]
SUB AX,30H
LOOP LOOP1
OUT3:
ret
CONVERT ENDP
;-----------------------------------------------------------------DISPLAY PROC NEAR
MOV BX,AX;ax中存放着答案,但是因为后面要用到ax所以把值放到;bx中MOV CX,16 ;计数器设置为16
MOV AH,2H ;为输出作准备此处用到ax,若不做上面的处理
LOOP2:
ROL BX,1 ;把bx左移1位,若有进位cf=1
JC PRINT1 ;监测cf如果是1,则跳转道print1
MOV DX,'0';到这说明他不是,则把‘0’送入dx.dx为输出的内容JMP PRINT0 ;然后跳转道print0
PRINT1:
MOV DX,'1'
PRINT0:
PUSH AX;判断如果cx能被4整除,则输出空格
PUSH DX;这里是保护ax dx cx让他们进栈。

PUSH CX
MOV AL,CL
DIV TAB
CMP AH,0
JNE OUT4
MOV AH,2H
MOV DX,' '
INT 21H
OUT4:
POP CX
POP DX
POP AX;栈的特点是先进后出,所以要反序出栈
INT 21H ;中断,跳转到dos所提供的功能,输出
LOOP LOOP2 ;cx-1 然后进行循环,直到cx==0终止
;LEA BX,array
;LOOP2:
;MOV DX,[BX]
;MOV AH,2H ;print the number
;INT 21H。