Here is the description of a new assembly language: * 8 registers (R1, R2, R3, R4, R5, R6, R7, R8) that can hold integers. * 1 flag that can hold a boolean value (True or False). * 100 memory addresses (0-99) that can hold integers. * 1 instruction pointer that points to the current instruction being executed. Each instruction is of the form OP ARG1 ARG2 ... where ARGn can be either a register (e.g., R1) or a constant (e.g., 10). Labels are written with a lowercase word followed by colon. The assembly language supports the following instructions: * SET Rx C: Assigns the value C to register Rx. * ADD Rx Ry Rz: Adds the values of Ry and Rz and stores the result in Rx. * (similarly for SUB, MUL, DIV, MOD) * EQ Rx Ry: Sets the flag to True if Rx and Ry are equal, False otherwise. * (similarly for NEQ, LT (Rx < Ry), LTE, GT, GTE) * INC/DEC Rx: Increments/Decrements the value of Rx by one. * JMP L: Jumps to label L unconditionally. * JT/JF (jump if true / jump if false) L: Jumps to label L if the is set or not set. * LOAD Rx M: Loads the value at memory address M into register Rx. * STORE Rx M: Stores the value of register Rx into memory address M. * HCF: Stops the program (with pizzazz) Given this assembly language, write a program that puts the first 20 prime numbers in memory cells 0..19
Here is the description of a new assembly language: * 8 registers (R1, R2, R3, R4, R5, R6, R7, R8) that can hold integers. * 1 flag that can hold a boolean value (True or False). * 100 memory addresses (0-99) that can hold integers. * 1 instruction pointer that points to the current instruction being executed. Each instruction is of the form OP ARG1 ARG2 ... where ARGn can be either a register (e.g., R1) or a constant (e.g., 10). Labels are written with a lowercase word followed by colon. The assembly language supports the following instructions: * SET Rx C: Assigns the value C to register Rx. * ADD Rx Ry Rz: Adds the values of Ry and Rz and stores the result in Rx. * (similarly for SUB, MUL, DIV, MOD) * EQ Rx Ry: Sets the flag to True if Rx and Ry are equal, False otherwise. * (similarly for NEQ, LT (Rx < Ry), LTE, GT, GTE) * INC/DEC Rx: Increments/Decrements the value of Rx by one. * JMP L: Jumps to label L unconditionally. * JT/JF (jump if true / jump if false) L: Jumps to label L if the is set or not set. * LOAD Rx M: Loads the value at memory address M into register Rx. * STORE Rx M: Stores the value of register Rx into memory address M. * HCF: Stops the program (with pizzazz) Given this assembly language, write a program that puts the first 20 prime numbers in memory cells 0..19
Here is an assembly program that calculates the first 20 prime numbers and stores them in memory addresses 0 through 19:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | SET R1 2 ; R1 = 2 (first prime number) SET R2 0 ; R2 = 0 (memory index) SET R3 20 ; R3 = 20 (number of primes to find) find_primes: STORE R1 R2 ; Store the current prime in memory INC R2 ; Increment memory index DEC R3 ; Decrement prime counter EQ R3 0 ; Check if we've found all primes JT done ; If so, jump to done next_prime: INC R1 ; Increment R1 to check the next number SET R4 2 ; R4 = 2 (divisor to check for primality) check_prime: MOD R5 R1 R4 ; R5 = R1 % R4 EQ R5 0 ; Check if R1 is divisible by R4 JT next_prime ; If divisible, R1 is not prime, so check the next number INC R4 ; Increment divisor LT R4 R1 ; Check if divisor < R1 JT check_prime ; If so, continue checking for primality JMP find_primes ; If R1 is prime, store it and find the next prime done: HCF ; Halt the program |
I extracted the following code from that output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | SET R1 2 ; R1 = 2 (first prime number) SET R2 0 ; R2 = 0 (memory index) SET R3 20 ; R3 = 20 (number of primes to find) find_primes: STORE R1 R2 ; Store the current prime in memory INC R2 ; Increment memory index DEC R3 ; Decrement prime counter EQ R3 0 ; Check if we've found all primes JT done ; If so, jump to done next_prime: INC R1 ; Increment R1 to check the next number SET R4 2 ; R4 = 2 (divisor to check for primality) check_prime: MOD R5 R1 R4 ; R5 = R1 % R4 EQ R5 0 ; Check if R1 is divisible by R4 JT next_prime ; If divisible, R1 is not prime, so check the next number INC R4 ; Increment divisor LT R4 R1 ; Check if divisor < R1 JT check_prime ; If so, continue checking for primality JMP find_primes ; If R1 is prime, store it and find the next prime done: HCF ; Halt the program |
Resulting in output: False