实现:输入一个数 判断正负并输出源数据
大致思路:
设置一个flag 记录正负
正数 直接存内存然后输出
负数 neg 以负数的形式存入内存
输出的时候 neg 回去调用正数的output函数
前面加一个’-'以-XX的形式输出
DATAS SEGMENT
;此处输入数据段代码 0正 1负数
STR1 DB 'Please input a number:',13,10,'$'
STR2 DB 'Output:',13,10,'$'
ARR DW 10 DUP(0)
DATAS ENDS
STACKS SEGMENT
;此处输入堆栈段代码
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
;此处输入代码段代码
LEA DX ,OFFSET STR1
MOV AH,9
INT 21H; 提示语句STR1
MOV SI,OFFSET ARR
CALL INPUT
LEA DX ,OFFSET STR2
MOV AH,9
INT 21H; 提示语句STR2
MOV AX,[SI]
MOV BX,AX
AND BX,8000H
JZ L0;与的结果是0 代表是正数 跳到L0
;若为负数 先将负数转换为正数 在输出(内存区存的是负数)
NEG AX
MOV BX,AX
MOV DL,'-'
MOV AH,2
INT 21H
MOV AX,BX ;OUTPUT 入口函数是AX
L0:
CALL OUTPUT
MOV AH,4CH
INT 21H
INPUT PROC
PUSH AX
PUSH BX
PUSH DX
MOV BL,10
JMP L1
SIG :
MOV CL,1 ;标志 =1为负数 =0正数
L1:
MOV AH,1
INT 21H
CMP AL,'-'
JE SIG
CMP AL,'0'
JB L2
CMP AL,'9'
JA L2
MOV AH,0
SUB AL,48
MOV DX,AX;当前输入的数据存入DX
MOV AL,[SI] ;取出内存已有的数据*10
MUL BL
ADD AX,DX;[SI]*10+DX=输入的数据
MOV [SI],AX
JMP L1
L2:
CMP CL,1
JNE OVER
;负数取NEG 以负数的形式存
MOV AX,[SI]
NEG AX
MOV [SI],AX
OVER:
POP DX
POP BX
POP AX
RET
INPUT ENDP
OUTPUT PROC;入口参数AX
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV BL,10;乘数
MOV BH,0;入栈次数
L3:
CMP AX,0
JE PRINT
DIV BL ;商-AL 余数-AH
INC BH;计数器加一
MOV CL,AL ;存商 接着除
MOV AL,AH
MOV AH,0 ;AX=AL
PUSH AX
;压栈 只有余数
MOV AL,CL
JMP L3
PRINT:
CMP BH,0;出栈
JE OVER
POP DX
DEC BH;计数器--
ADD DL,48
MOV AH,2
INT 21H
JMP PRINT
OVER:
POP DX
POP CX
POP BX
POP AX
RET
OUTPUT ENDP
CODES ENDS
END START