Advertisement
Guest User

for_zheka

a guest
Dec 17th, 2016
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ARM 2.71 KB | None | 0 0
  1. STEG SEGMENT PARA STACK "STACK"
  2. DB 64 DUP("STACK")
  3. STEG ENDS
  4.  
  5.  
  6.  
  7. DSEG SEGMENT PARA PUBLIC "DATA"
  8.  
  9. HELLO_STRING DB 'Enter your number from -333 to 333: ',13,10,'$'
  10. OUTPUT_STRING DB 13,10,"Your number: ",'$'
  11. ERROR_STRING DB 13,10,'Error! Incorrect input!',13,10,'$'
  12. INPUT DB 5,?,5 DUP('$')
  13. IS_NEGATIVE DB 1 DUP('0')
  14.  
  15. DSEG ENDS
  16.  
  17.  
  18.  
  19. CSEG SEGMENT PARA PUBLIC "CODE"
  20.  
  21. MAIN PROC FAR
  22. assume SS:STEG, DS:DSEG, CS:CSEG
  23.  
  24. PUSH DS
  25. PUSH AX
  26. XOR AX, AX; MOV AX,0
  27. MOV AX, DSEG
  28. MOV DS, AX
  29.  
  30. CALL INPUT_NUMBER
  31. CALL OUTPUT_NUMBER
  32.  
  33. mov ah, 08h;ah - elder bite of AX. 8(read 1 symbol)2(outout 1 symb)9(str on screen)10(read str to enter)
  34.     int 21h
  35.  
  36. mov ax,4C00h;dos func exit from program
  37.     int 21h
  38.  
  39. MAIN ENDP
  40.  
  41.  
  42.  
  43.  
  44. INPUT_NUMBER PROC NEAR;near 128 byte stack
  45.  
  46. MOV AH, 9;output str
  47. LEA DX, HELLO_STRING
  48. INT 21H
  49.  
  50. LEA DX, INPUT
  51. MOV AH, 10;read line
  52. INT 21H
  53.  
  54. LEA DI, INPUT+2
  55. MOV AL, [DI]
  56. CMP AL, '-';zf 1
  57. JE NEGATIVE;if zf==1
  58. CMP AL,'+'
  59. JE POSITIVE
  60.  
  61. LABEL1:
  62.    XOR BX,BX;bx==0
  63.    MOV BX,10
  64.    XOR AX,AX
  65.    
  66. LABEL2:
  67.    XOR CX,CX                 ; ERROR SYMBOL
  68.    CMP BYTE PTR [DI], 0DH;compare 3rd+ byte==$    
  69.    JZ LABEL5;if zf==1 ->
  70.    CMP BYTE PTR [DI], 30H;<0  
  71.    JB ERROR;if cf==1 ->
  72.    CMP BYTE PTR [DI], 39H;>9  
  73.    JA ERROR;if cd,zf==0,0
  74.    MOV CL, [DI]
  75.    SUB CL, 30H;cl=cl-30h translate to hex              
  76.    MUL BX ;AX=BX*AX MUL (BX==10)
  77.    JC ERROR;(65512)if cf==0 ->            
  78.    ADD AX,CX;AX+CX
  79.    JC ERROR
  80.    INC DI;DI++
  81.    JMP LABEL2;if CX!=0 then ->
  82.  
  83. NEGATIVE:                  
  84.    PUSH AX;put in stack
  85.    MOV AL, 1
  86.    MOV IS_NEGATIVE, AL
  87.    POP AX;get from stack
  88.    INC DI
  89.    JMP LABEL1
  90.  
  91. POSITIVE:
  92.    PUSH AX
  93.    MOV AL, 0
  94.    MOV IS_NEGATIVE, AL
  95.    POP AX
  96.    INC DI
  97.    JMP LABEL1
  98.  
  99. ERROR:              
  100.    MOV AH, 9
  101.    LEA DX, ERROR_STRING
  102.    INT 21H
  103.  
  104.    mov  ah, 08h
  105.     int 21h
  106.  
  107.    mov ax,4C00h
  108.     int 21h
  109.  
  110. LABEL5:
  111.    CMP AX, 333;zf,cf = 0,0
  112.    JA ERROR
  113.    MOV CL, IS_NEGATIVE
  114.    CMP CL, 1;if cl==1 then zf=1
  115.    JNZ L6; if zf!=0 call ->
  116.    NEG AX;*(-1)
  117.  
  118. L6:   RET;return
  119. INPUT_NUMBER ENDP
  120.  
  121.  
  122.  
  123. OUTPUT_NUMBER PROC NEAR
  124.  
  125.  
  126. MOV CX, AX;for jumper      
  127.  
  128. MOV AH, 9
  129. LEA DX, OUTPUT_STRING
  130. INT 21H
  131.  
  132. MOV AX,CX      
  133. MOV BL, IS_NEGATIVE    
  134. CMP BL, 1
  135. JNZ POS;zf!=0->
  136.  
  137. MOV AH,2;interrupt 1 symbol    
  138. MOV DL, '-'
  139. INT 21H
  140.  
  141. MOV AX,CX
  142. NEG AX
  143. POS:
  144.    XOR CX,CX ;CX = 0
  145.    XOR BX,BX
  146.    MOV BX,10 ;BL=10
  147. L1:
  148.    XOR DX,DX
  149.    DIV BX           ; AX /(DIVIDE) BX RESULT DX
  150.    PUSH DX          
  151.    INC CX          
  152.    
  153.    TEST AX,AX       ; IF AX = 0, ZF = 1
  154.    JNZ L1
  155.    MOV AH,2
  156. L2:
  157.    POP DX      
  158.    ADD DL, 30H;translate to dec    
  159.    INT 21H
  160.    LOOP L2;while cx !=0->  
  161.  
  162. RET
  163.  
  164. OUTPUT_NUMBER ENDP
  165.  
  166. CSEG ENDS
  167. END MAIN
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement