Advertisement
AsafBenShabat

Untitled

May 18th, 2017
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.67 KB | None | 0 0
  1. .MODEL SMALL
  2. .STACK 100h
  3. .DATA
  4. I DD 1
  5. TEN DD 10
  6. SUM DD 0
  7. FLAG DD ?
  8. TWO DD 2
  9. iteraz DD 0
  10. TOTAL DD 0
  11. numStr DB 'Please enter number between 1 to 2147483647: ','$'
  12. perStr DB 13,10,'perfect number',13,10,'$'
  13. notStr DB 13,10,'not perfect number',13,10,'$'
  14. .CODE
  15. .386
  16. getPnum PROC NEAR ; FIRST FUNCTION ;REMEMBER!!: MOVE DX, OFFSET numStr!!!!!**********in main!!
  17. PUSH EAX
  18. PUSH EBX
  19. PUSH ECX
  20. PUSH EDX
  21. MOV AH,3Fh
  22. MOV BX,0
  23. INT 21h ;starting every procedure
  24. JMP loopiTest
  25. loopi:
  26. MOV AH, 0
  27. SUB AL, '0' ;make it a num.
  28. MOV EDX, 0 ;preparation for MUL op.
  29. MOV ECX, 0 ;
  30. MOV CL, AL ;preparation for moving eax ->> ecx.
  31. MOV ECX, EAX ;
  32. MOV EAX, SUM
  33. MUL TEN ;answer goes to ->> edx:eax. edx gonna stay empty.
  34. MOV SUM, EAX
  35. ADD SUM, ECX ;both 32 bit. we can add, after i "made space" by ten's multiply. and kept the new num in ECX.
  36. loopiTest:
  37. MOV EAX, 0
  38. MOV ECX, 0
  39. MOV EDX, 0
  40. MOV AH, 1 ;set scan op.
  41. INT 21h ;scan!
  42. CMP AL, 13 ;is it 'enter'?
  43. JE EndOfNum
  44. JNE loopi
  45. EndOfNum:
  46. POP EAX
  47. POP EBX
  48. POP ECX
  49. POP EDX
  50. RET
  51. getPnum ENDP
  52. ;SO FAR BUILD NUM FUNC! ;SUM will have the final num.
  53.  
  54. Pnum PROC NEAR ;will return TRUE of FALSE value if it's perfect number or not.
  55. PUSH EAX ;BACKUP EVERYTHING.
  56. PUSH EBX
  57. PUSH ECX
  58. PUSH EDX
  59. MOV EAX, 0 ; clean var's to work with.
  60. MOV EBX, 0
  61. MOV ECX, 0
  62. MOV EDX, 0
  63. MOV AH,3Fh
  64. MOV BX,0
  65. INT 21h ;starting every procedure
  66. MOV EAX, SUM ;prepare for DIV.
  67. DIV TWO ; % ->> DX. / ->> AX.
  68. CMP EDX, 0
  69. JNE notPerfect
  70. MOV iteraz, EAX ;put in a for loop.
  71. ;for loop start.
  72. MOV EBX, 0 ;EBX will be my I counter.
  73. JMP NextTest
  74. loopbody:
  75. MOV EAX, SUM
  76. MOV EDX, 0
  77. DIV EBX
  78. CMP EDX, 0
  79. JNE NextTest
  80. ADD TOTAL, EBX
  81.  
  82. NextTest:
  83. INC EBX
  84. CMP EBX, iteraz
  85. JBE loopbody
  86.  
  87. loopend:
  88. MOV ECX, SUM
  89. CMP TOTAL, ECX
  90. JE perfect
  91. JNE notPerfect
  92. perfect:
  93. MOV FLAG, 1
  94. JMP byebye
  95. notPerfect:
  96. MOV FLAG, 0
  97. JMP byebye
  98. byebye:
  99. POP EAX
  100. POP EBX
  101. POP ECX
  102. POP EDX
  103. RET
  104. Pnum ENDP
  105.  
  106. ProgStart:
  107. MOV AX,@DATA ; DS can be written to only through a register
  108. MOV DS,AX ; Set DS to point to data segment
  109. MOV DX, OFFSET numStr
  110. MOV AH, 9
  111. INT 21h
  112. CALL getPnum ;the num is in SUM var. 32 bit size. 4 bytes.
  113. CALL Pnum
  114. CMP FLAG, 1
  115. JE setPer
  116. CMP FLAG, 0
  117. JE setNotPer
  118. setPer:
  119. MOV DX, OFFSET perStr
  120. JMP Finish
  121. setNotPer:
  122. MOV DX, OFFSET notStr
  123. JMP Finish
  124. Finish: ;finnishing lable
  125. MOV AH, 9
  126. INT 21h
  127. MOV AH,4Ch ; Set terminate option for int 21h
  128. INT 21h ; Return to DOS (terminate program)
  129. END ProgStart
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement