Guest User

Untitled

a guest
Jan 13th, 2018
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. STSEG SEGMENT PARA STACK "STACK"
  2. DB 64 DUP("STACK")
  3. STSEG ENDS
  4.  
  5. DSEG SEGMENT PARA PUBLIC "DATA"
  6.  
  7. HELLO_MESSAGE DB 'Input number [-32767..32767]: ',13,10,'$'
  8. OUTPUT_MESSAGE DB "You've entered number: ",'$'
  9. BAD_INPUT DB 'Incorrect input!',13,10,'$'
  10. INPUT DB 7,?,8 DUP('$')
  11. IS_NEGATIVE DB 1 DUP('0')
  12. DSEG ENDS
  13.  
  14. CSEG SEGMENT PARA PUBLIC "CODE"
  15. MAIN PROC FAR
  16. ASSUME SS:STSEG, DS: DSEG,CS:CSEG
  17. PUSH DS
  18. XOR AX, AX
  19. PUSH AX
  20. MOV AX, DSEG
  21. MOV DS, AX
  22. CALL INPUT_NUMBER
  23. CALL OUTPUT_NUMBER
  24. RET
  25. MAIN ENDP
  26.  
  27.  
  28. INPUT_NUMBER PROC NEAR
  29.  
  30. ; write message
  31. MOV AH, 9
  32. LEA DX, HELLO_MESSAGE
  33. INT 21H
  34.  
  35. ;read line
  36. LEA DX, INPUT
  37. MOV AH, 10
  38. INT 21H
  39.  
  40. MOV DI, offset INPUT+2 ; DI - POINTER TO THIRD ELEMENT OF INPUT
  41. CMP BYTE PTR [DI], '-' ;
  42. JE NEGATIVE            ; IF [DI] == '-' GOTO NEGATIVE
  43. CMP BYTE PTR [DI],'+'
  44. JE POSITIVE
  45.  
  46. LABEL1:
  47.    XOR BX,BX    ; BX=0000
  48.    MOV BX,10
  49.    XOR AX,AX
  50.    
  51. LABEL2:
  52.    XOR CX,CX
  53.    CMP BYTE PTR [DI], 0DH    ; ODH - END STRING
  54.    JZ LABEL5
  55.    CMP BYTE PTR [DI], 30H    ; IF <30 - NOT A NUMBER
  56.    JB BAD_NUMBER
  57.    CMP BYTE PTR [DI], 39H    ; IF >39 - NOT A NUMBER
  58.    JA BAD_NUMBER
  59.    MOV CL, [DI]
  60.    SUB CL, 30H               ; CONVERT TO NUMBER 0..9
  61.    MUL BX                    ; MUL BL AND AL, RESULT IN AX
  62.    JC BAD_NUMBER             ; JUMP IF CARRY FLAG (WE HAVE OVERFLOW)
  63.    ADD AX,CX
  64.    JC BAD_NUMBER
  65.    INC DI
  66.    JMP LABEL2
  67. NEGATIVE:                  ; SET IS_NEGATIVE 1
  68.    PUSH AX
  69.    MOV AL, IS_NEGATIVE
  70.    MOV AL, 1
  71.    MOV IS_NEGATIVE, AL
  72.    POP AX
  73.    INC DI
  74.    JMP LABEL1
  75. POSITIVE:
  76.    PUSH AX
  77.    MOV AL, 0
  78.    MOV IS_NEGATIVE, AL
  79.    POP AX
  80.    INC DI
  81.    JMP LABEL1
  82. BAD_NUMBER:              ;ERROR OR BAD NUMBER
  83.    MOV AH, 9
  84.    LEA DX, BAD_INPUT
  85.    INT 21H
  86.    MOV AH, 1 ; GETCH() WAIT FOR USER (READING MESSAGE)
  87.    INT 21H
  88.    MOV AH, 4CH ; EXIT() IN C
  89.    INT 21H
  90. LABEL5:
  91.    CMP AX, 32767
  92.    JA BAD_NUMBER
  93.    MOV CL, IS_NEGATIVE
  94.    CMP CL, 1
  95.    JNZ L6
  96.    NEG AX
  97. L6:   RET
  98. INPUT_NUMBER ENDP
  99.  
  100. OUTPUT_NUMBER PROC NEAR
  101.  
  102.  
  103. MOV CX, AX ; MOVE OUR NUMBER TO CX -> USING INT
  104.  
  105. ; write message
  106. MOV AH, 9
  107. LEA DX, OUTPUT_MESSAGE
  108. INT 21H
  109.  
  110. MOV AX,CX ; MOVE OUR NUMBER BACK TO AX
  111. MOV BL, IS_NEGATIVE ; IF IS_NEGATIVE = 1 -> OUR NUMBER NEGATIVE -> OUTPUT '-'
  112. CMP BL, 1
  113. JNZ POS
  114. MOV AH,2  ; OUTPUT CHAR
  115. MOV DL, '-'
  116. INT 21H
  117. MOV AX,CX
  118. NEG AX
  119. POS:
  120.    XOR CX,CX ;CX = 0
  121.    XOR BX,BX
  122.    MOV BX,10 ;BL=10
  123. L1:
  124.    XOR DX,DX
  125.    DIV BX   ; AX DIVIDE BX RESULT DX
  126.    PUSH DX  ; PUSH DIGIT TO STACK
  127.    INC CX   ; INC COUNTER OF DIGITS
  128.    
  129.    TEST AX,AX ; IF AX = 0, ZF = 1
  130.    JNZ L1
  131.    MOV AH,2 ;
  132. L2:
  133.    POP DX ; BRING OUR DIGIT
  134.    ADD DL, 30H ; ADD 30 OR '0' TO CONVERT NUMBER TO CHAR
  135.    INT 21H
  136.    LOOP L2 ; CX = NUMBER OF DIGITS EVERY LOOP DEC CX. IF CX=0 LOOP ENDS
  137. RET
  138. OUTPUT_NUMBER ENDP
  139.  
  140. CSEG ENDS
  141. END MAIN
Add Comment
Please, Sign In to add comment