Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .MODEL SMALL
- .STACK 100h
- .DATA
- I DD 1
- TEN DD 10
- SUM DD 0
- FLAG DD ?
- TWO DD 2
- iteraz DD 0
- TOTAL DD 0
- numStr DB 'Please enter number between 1 to 2147483647: ','$'
- perStr DB 13,10,'perfect number',13,10,'$'
- notStr DB 13,10,'not perfect number',13,10,'$'
- .CODE
- .386
- getPnum PROC NEAR ; FIRST FUNCTION ;REMEMBER!!: MOVE DX, OFFSET numStr!!!!!**********in main!!
- PUSH EAX
- PUSH EBX
- PUSH ECX
- PUSH EDX
- MOV AH,3Fh
- MOV BX,0
- INT 21h ;starting every procedure
- JMP loopiTest
- loopi:
- MOV AH, 0
- SUB AL, '0' ;make it a num.
- MOV EDX, 0 ;preparation for MUL op.
- MOV ECX, 0 ;
- MOV CL, AL ;preparation for moving eax ->> ecx.
- MOV ECX, EAX ;
- MOV EAX, SUM
- MUL TEN ;answer goes to ->> edx:eax. edx gonna stay empty.
- MOV SUM, EAX
- ADD SUM, ECX ;both 32 bit. we can add, after i "made space" by ten's multiply. and kept the new num in ECX.
- loopiTest:
- MOV EAX, 0
- MOV ECX, 0
- MOV EDX, 0
- MOV AH, 1 ;set scan op.
- INT 21h ;scan!
- CMP AL, 13 ;is it 'enter'?
- JE EndOfNum
- JNE loopi
- EndOfNum:
- POP EAX
- POP EBX
- POP ECX
- POP EDX
- RET
- getPnum ENDP
- ;SO FAR BUILD NUM FUNC! ;SUM will have the final num.
- Pnum PROC NEAR ;will return TRUE of FALSE value if it's perfect number or not.
- PUSH EAX ;BACKUP EVERYTHING.
- PUSH EBX
- PUSH ECX
- PUSH EDX
- MOV EAX, 0 ; clean var's to work with.
- MOV EBX, 0
- MOV ECX, 0
- MOV EDX, 0
- MOV AH,3Fh
- MOV BX,0
- INT 21h ;starting every procedure
- MOV EAX, SUM ;prepare for DIV.
- DIV TWO ; % ->> DX. / ->> AX.
- CMP EDX, 0
- JNE notPerfect
- MOV iteraz, EAX ;put in a for loop.
- ;for loop start.
- MOV EBX, 0 ;EBX will be my I counter.
- JMP NextTest
- loopbody:
- MOV EAX, SUM
- MOV EDX, 0
- DIV EBX
- CMP EDX, 0
- JNE NextTest
- ADD TOTAL, EBX
- NextTest:
- INC EBX
- CMP EBX, iteraz
- JBE loopbody
- loopend:
- MOV ECX, SUM
- CMP TOTAL, ECX
- JE perfect
- JNE notPerfect
- perfect:
- MOV FLAG, 1
- JMP byebye
- notPerfect:
- MOV FLAG, 0
- JMP byebye
- byebye:
- POP EAX
- POP EBX
- POP ECX
- POP EDX
- RET
- Pnum ENDP
- ProgStart:
- MOV AX,@DATA ; DS can be written to only through a register
- MOV DS,AX ; Set DS to point to data segment
- MOV DX, OFFSET numStr
- MOV AH, 9
- INT 21h
- CALL getPnum ;the num is in SUM var. 32 bit size. 4 bytes.
- CALL Pnum
- CMP FLAG, 1
- JE setPer
- CMP FLAG, 0
- JE setNotPer
- setPer:
- MOV DX, OFFSET perStr
- JMP Finish
- setNotPer:
- MOV DX, OFFSET notStr
- JMP Finish
- Finish: ;finnishing lable
- MOV AH, 9
- INT 21h
- MOV AH,4Ch ; Set terminate option for int 21h
- INT 21h ; Return to DOS (terminate program)
- END ProgStart
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement