; UFRGS - INF - Bruno Mascali - 2024 ; Check if the number (1 <= number <= 129) at address 80h is prime ; A prime number is a natural number that is divisible only by 1 and itself ; ----- DATA org h80 number: DB 2 ; The number to check for primality test_divisor: DB 0 ; Current divisor being tested output: DAB [9] ; Output message buffer outputend: DB 0 ; buffer end msgsize: equ outputend-output ; ----- ERASE MESSAGE ----- ; RA = 0 ; RB = counter ; RX = position org 0 LDR A #0 ; will write 0's at output LDR B #msgsize ; msg buffer size LDR X #output ; buffer address apaga: STR A 0,X ; erase this position ADD X #1 ; advance SUB B #1 ; one less to go JZ start_up ; if done, start the algorithm JMP apaga ; goto erase next ; ----- BEGIN MAIN CODE ----- ; RA = number ; RB = current divisor start_up: LDR A, number SUB A, #1 JZ not_prime ; If number is 1, it is not prime LDR A, #0 ADD A, #1 STR A, test_divisor ; Initialize test_divisor to 1 LDR B, test_divisor outer_loop: ADD B, #1 STR B, test_divisor LDR A, number division: SUB A, test_divisor JZ check_if_prime ; If the result is zero, a factor is found JN outer_loop ; If not zero and not negative, continue with next divisor JMP division ; Continue the division process check_if_prime: LDR A, number STR B, test_divisor SUB A, test_divisor JZ prime ; If number == test_divisor, it is prime JMP not_prime ; Otherwise, it is not prime prime: LDR A, #'P' STR A, output LDR A, #'r' STR A, output+1 LDR A, #'i' STR A, output+2 LDR A, #'m' STR A, output+3 LDR A, #'e' STR A, output+4 HLT ; Halt after writing "prime" not_prime: LDR A, #'C' STR A, output LDR A, #'o' STR A, output+1 LDR A, #'m' STR A, output+2 LDR A, #'p' STR A, output+3 LDR A, #'o' STR A, output+4 LDR A, #'s' STR A, output+5 LDR A, #'i' STR A, output+6 LDR A, #'t' STR A, output+7 LDR A, #'e' STR A, output+8 HLT ; Halt after writing "composite" ; ----- END OF FILE -----