Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- STSEG SEGMENT PARA STACK "STACK"
- DB 64 DUP("STACK")
- STSEG ENDS
- DSEG SEGMENT PARA PUBLIC "DATA"
- HELLO_MESSAGE DB 'Input number [-32767..32767]: ',13,10,'$'
- OUTPUT_MESSAGE DB "You've entered number: ",'$'
- BAD_INPUT DB 'Incorrect input!',13,10,'$'
- INPUT DB 7,?,8 DUP('$')
- IS_NEGATIVE DB 1 DUP('0')
- DSEG ENDS
- CSEG SEGMENT PARA PUBLIC "CODE"
- MAIN PROC FAR
- ASSUME SS:STSEG, DS: DSEG,CS:CSEG
- PUSH DS
- XOR AX, AX
- PUSH AX
- MOV AX, DSEG
- MOV DS, AX
- CALL INPUT_NUMBER
- CALL OUTPUT_NUMBER
- RET
- MAIN ENDP
- INPUT_NUMBER PROC NEAR
- ; write message
- MOV AH, 9
- LEA DX, HELLO_MESSAGE
- INT 21H
- ;read line
- LEA DX, INPUT
- MOV AH, 10
- INT 21H
- MOV DI, offset INPUT+2 ; DI - POINTER TO THIRD ELEMENT OF INPUT
- CMP BYTE PTR [DI], '-' ;
- JE NEGATIVE ; IF [DI] == '-' GOTO NEGATIVE
- CMP BYTE PTR [DI],'+'
- JE POSITIVE
- LABEL1:
- XOR BX,BX ; BX=0000
- MOV BX,10
- XOR AX,AX
- LABEL2:
- XOR CX,CX
- CMP BYTE PTR [DI], 0DH ; ODH - END STRING
- JZ LABEL5
- CMP BYTE PTR [DI], 30H ; IF <30 - NOT A NUMBER
- JB BAD_NUMBER
- CMP BYTE PTR [DI], 39H ; IF >39 - NOT A NUMBER
- JA BAD_NUMBER
- MOV CL, [DI]
- SUB CL, 30H ; CONVERT TO NUMBER 0..9
- MUL BX ; MUL BL AND AL, RESULT IN AX
- JC BAD_NUMBER ; JUMP IF CARRY FLAG (WE HAVE OVERFLOW)
- ADD AX,CX
- JC BAD_NUMBER
- INC DI
- JMP LABEL2
- NEGATIVE: ; SET IS_NEGATIVE 1
- PUSH AX
- MOV AL, IS_NEGATIVE
- MOV AL, 1
- MOV IS_NEGATIVE, AL
- POP AX
- INC DI
- JMP LABEL1
- POSITIVE:
- PUSH AX
- MOV AL, 0
- MOV IS_NEGATIVE, AL
- POP AX
- INC DI
- JMP LABEL1
- BAD_NUMBER: ;ERROR OR BAD NUMBER
- MOV AH, 9
- LEA DX, BAD_INPUT
- INT 21H
- MOV AH, 1 ; GETCH() WAIT FOR USER (READING MESSAGE)
- INT 21H
- MOV AH, 4CH ; EXIT() IN C
- INT 21H
- LABEL5:
- CMP AX, 32767
- JA BAD_NUMBER
- MOV CL, IS_NEGATIVE
- CMP CL, 1
- JNZ L6
- NEG AX
- L6: RET
- INPUT_NUMBER ENDP
- OUTPUT_NUMBER PROC NEAR
- MOV CX, AX ; MOVE OUR NUMBER TO CX -> USING INT
- ; write message
- MOV AH, 9
- LEA DX, OUTPUT_MESSAGE
- INT 21H
- MOV AX,CX ; MOVE OUR NUMBER BACK TO AX
- MOV BL, IS_NEGATIVE ; IF IS_NEGATIVE = 1 -> OUR NUMBER NEGATIVE -> OUTPUT '-'
- CMP BL, 1
- JNZ POS
- MOV AH,2 ; OUTPUT CHAR
- MOV DL, '-'
- INT 21H
- MOV AX,CX
- NEG AX
- POS:
- XOR CX,CX ;CX = 0
- XOR BX,BX
- MOV BX,10 ;BL=10
- L1:
- XOR DX,DX
- DIV BX ; AX DIVIDE BX RESULT DX
- PUSH DX ; PUSH DIGIT TO STACK
- INC CX ; INC COUNTER OF DIGITS
- TEST AX,AX ; IF AX = 0, ZF = 1
- JNZ L1
- MOV AH,2 ;
- L2:
- POP DX ; BRING OUR DIGIT
- ADD DL, 30H ; ADD 30 OR '0' TO CONVERT NUMBER TO CHAR
- INT 21H
- LOOP L2 ; CX = NUMBER OF DIGITS EVERY LOOP DEC CX. IF CX=0 LOOP ENDS
- RET
- OUTPUT_NUMBER ENDP
- CSEG ENDS
- END MAIN
Add Comment
Please, Sign In to add comment