|
发表于 2020-12-9 19:30:01
|
显示全部楼层
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;从键盘上输入一个十进制数据并转换为二进制的子程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
P_GETNEW PROC
PUSH BX ;出口参数:AX=补码表示的二进制数
PUSH CX ;说明:负数用“-”引导,数据范围是+32767~-32768
PUSH DX
XOR BX,BX ;BX保存结果
XOR CX,CX ;CX为正负标志,0为正,-1为负
MOV AH,1 ;输入一个字符
INT 21H
CMP AL,'+' ;是“+”,继续输入字符
JZ READ1
CMP AL,'-' ;是“—,设置-1标志
JNZ READ2
MOV CX,-1
READ1: MOV AH,1 ;继续输入字符
INT 21H
READ2: CMP AL,'0' ;不是0~9之间的字符,则输入数据结束
JB READ3
CMP AL,'9'
JA READ3
SUB AL,30H ;是0~9之间的字符,则转换为二进制数
;利用移位指令,实现数值乘10:BX←BX*10
SHL BX,1
MOV DX,BX
SHL BX,1
SHL BX,1
ADD BX,DX
MOV AH,0
ADD BX,AX ;已输入数值乘10后,与新输入的数值相加
JMP READ1 ;继续输入字符
READ3: CMP CX,0 ;是负数,进行求补
JZ READ4
NEG BX
READ4: MOV AX,BX ;设置出口参数
POP DX
POP CX
POP BX
RET ;子程序返回
P_GETNEW ENDP
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;二进制数据转换为十进制的输出子程序
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
P_OUTPUT PROC
PUSH AX ;入口参数:共享变量WTEMP
PUSH BX
PUSH DX
MOV AX,WTEMP ;取出显示的数据
TEST AX,AX ;判断数据是零、正书还是负数
JNZ WRITE1
MOV DL,'0' ;是‘0’,显示‘0’后退出
MOV AH,2
INT 21H
JMP WRITE5
WRITE1: JNS WRITE2 ;是负数,显示“-”
MOV BX,AX ;AX数据暂存于BX
MOV DL,'-'
MOV AH,2
INT 21H
MOV AX,BX
NEG AX ;数据求补(绝对值)
WRITE2: MOV BX,10
PUSH BX ;10压入堆栈,做为推退出标志
WRITE3: CMP AX,0 ;数据(商)为零,转向显示
JZ WRITE4
SUB DX,DX ;扩展被除数DX.AX
DIV BX ;数据除以10
ADD DL,30H ;余数(0~9)转换为ASCⅡ码
PUSH DX ;数据各位先低位后高位压入堆栈
JMP WRITE3
WRITE4: POP DX ;数据各位先高位后低位弹出堆栈
CMP DL,10 ;是结束标志10,则退出
JE WRITE5
MOV AH,2 ;进行显示
INT 21H
JMP WRITE4
WRITE5: POP DX
POP BX
POP AX
MOV DL,20H
MOV AH,02H
INT 21H
RET ;子程序返回
P_OUTPUT ENDP |
|