FILE : 03B0SOLN.txt NAME : SOLUTIONS, NoFrills HW# : 3 PROGRAM: B ================================================================================ Problem Statement: ================================================================================ Using the program from Part A as a starting point, modify the program so that the user will enter the total number of cards to be sorted and then the card number of the first card in response to two GET instructions. ================================================================================ Problem Solution: ================================================================================ Solution from Part A: EQU PROGRAM_START (1) // Line number for first instruction EQU FIRSTCARD (10) // Actual number of the first card in the list EQU CARD (4) // Actual number of cards in the list EQU BORROW (1) // Card number where the borrow result is stored after a SUB EQU TEMP (2) // Card number where temporary results can be stored EQU LARGESTCARD (3) // Card number where the number of the largest card is stored EQU PRESENTCARD (4) // Card number where the number of the presen card is stored EQU LASTCARD (5) // Card number where the number of the last card is stored ORG PROGRAM_START SET LASTCARD, (FIRSTCARD + CARDS - 1) // Constant expression LABEL OUTER_LOOP SUB TEMP, FIRSTCARD, *LASTCARD // Borrow if LASTCARD > FIRSTCARD SKP BORROW JMP END_OF_OUTER_LOOP // Exit loop if LASTCARD <= FIRSTCARD // TASK: Identify Largest Card SET LARGESTCARD, FIRSTCARD // Largest Card seen yet on this pass SET PRESENTCARD, (FIRSTCARD + 1) // Always start with second card LABEL INNER_LOOP // Single Pass through cards SUB TEMP, *LASTCARD, *PRESENTCARD // Borrow if PRESENTCARD > LASTCARD SKP BORROW JMP INNER_LOOP_CODE // Stay in loop if PRESENTCARD <= LASTCARD JMP END_OF_INNER_LOOP // Exit loop if PRESENTCARD > LASTCARD LABEL INNER_LOOP_CODE SUB TEMP, **LARGESTCARD, **PRESENTCARD // Borrow if *PRESENTCARD > *LARGESTCARD SKP BORROW JMP END_IF_CODE // Jump over if *PRESENTCARD <= *LARGESTCARD LABEL IF_CODE SET LARGESTCARD, *PRESENTCARD // Update largest card see so far LABEL END_IF_CODE ADD PRESENTCARD, *PRESENTCARD, 1 // Move on to next card JMP INNER_LOOP LABEL END_OF_INNER_LOOP SET TEMP, **LASTCARD // Swap Largest Card with Last Card SET *LASTCARD, **LARGESTCARD SET *LARGESTCARD, *TEMP SUB LASTCARD, *LASTCARD, 1 // Remove last card from next search loop JMP OUTER_LOOP LABEL END_OF_OUTER_LOOP NOP // Just to have someplace to jump to Looking at the above solution, we see that all we need to do is allocate two cards to store the value of FIRSTCARD and CARDS instead of having them be literal constants. Then any instruction that uses either of those values, we need to rewrite so that it uses the numbers off the allocated cards. As it turns out, there are no such instructions once we reach the start of the inner loop. So we can focus on the following segment of our code: ORG PROGRAM_START SET LASTCARD, (FIRSTCARD + CARDS - 1) // Constant expression LABEL OUTER_LOOP SUB TEMP, FIRSTCARD, *LASTCARD // Borrow if LASTCARD > FIRSTCARD SKP BORROW JMP END_OF_OUTER_LOOP // Exit loop if LASTCARD <= FIRSTCARD // TASK: Identify Largest Card SET LARGESTCARD, FIRSTCARD // Largest Card seen yet on this pass SET PRESENTCARD, (FIRSTCARD + 1) // Always start with second card If we allocate the additional cards as follows: EQU FIRSTCARD (6) EQU CARDS (7) Then we can write the above code as: ORG PROGRAM_START GET CARDS // Get total number of cards from user GET FIRSTCARD // Get location of first value from user ADD LASTCARD, *FIRSTCARD, *CARDS SUB LASTCARD, *LASTCARD, 1 LABEL OUTER_LOOP SUB TEMP, *FIRSTCARD, *LASTCARD // Borrow if LASTCARD > FIRSTCARD SKP BORROW JMP END_OF_OUTER_LOOP // Exit loop if LASTCARD <= FIRSTCARD // TASK: Identify Largest Card SET LARGESTCARD, *FIRSTCARD // Largest Card seen yet on this pass ADD PRESENTCARD, *FIRSTCARD, 1 // Always start with second card Since our expressions are no longer constant, we had to add the code to do the computations on the fly. But the expressions involved were fortunately very simply. The rest of the code is identical to Program A ================================================================================ ACME-1021 ASSEMBLY CODE ================================================================================ EQU PROGRAM_START (1) // Line number for first instruction EQU BORROW (1) // Card number where the borrow result is stored after a SUB EQU TEMP (2) // Card number where temporary results can be stored EQU LARGESTCARD (3) // Card number where the number of the largest card is stored EQU PRESENTCARD (4) // Card number where the number of the presen card is stored EQU LASTCARD (5) // Card number where the number of the last card is stored EQU FIRSTCARD (6) // Card number where the number of cards to sort is stored EQU CARDS (7) // Card number where the number of the first card is stored ORG PROGRAM_START GET CARDS // Get total number of cards from user GET FIRSTCARD // Get location of first value from user ADD LASTCARD, *FIRSTCARD, *CARDS SUB LASTCARD, *LASTCARD, 1 LABEL OUTER_LOOP SUB TEMP, *FIRSTCARD, *LASTCARD // Borrow if LASTCARD > FIRSTCARD SKP BORROW JMP END_OF_OUTER_LOOP // Exit loop if LASTCARD <= FIRSTCARD // TASK: Identify Largest Card SET LARGESTCARD, *FIRSTCARD // Largest Card seen yet on this pass ADD PRESENTCARD, *FIRSTCARD, 1 // Always start with second card LABEL INNER_LOOP // Single Pass through cards SUB TEMP, *LASTCARD, *PRESENTCARD // Borrow if PRESENTCARD > LASTCARD SKP BORROW JMP INNER_LOOP_CODE // Stay in loop if PRESENTCARD <= LASTCARD JMP END_OF_INNER_LOOP // Exit loop if PRESENTCARD > LASTCARD LABEL INNER_LOOP_CODE SUB TEMP, **LARGESTCARD, **PRESENTCARD // Borrow if *PRESENTCARD > *LARGESTCARD SKP BORROW JMP END_IF_CODE // Jump over if *PRESENTCARD <= *LARGESTCARD LABEL IF_CODE SET LARGESTCARD, *PRESENTCARD // Update largest card see so far LABEL END_IF_CODE ADD PRESENTCARD, *PRESENTCARD, 1 // Move on to next card JMP INNER_LOOP LABEL END_OF_INNER_LOOP SET TEMP, **LASTCARD // Swap Largest Card with Last Card SET *LASTCARD, **LARGESTCARD SET *LARGESTCARD, *TEMP SUB LASTCARD, *LASTCARD, 1 // Remove last card from next search loop JMP OUTER_LOOP LABEL END_OF_OUTER_LOOP NOP // Just to have someplace to jump to ================================================================================ ACME-1021 INSTRUCTION DECK ================================================================================ 1 GET 7 2 GET 6 3 ADD 5, *6, *7 4 SUB 5, *5, 1 5 SUB 2, *6, *5 6 SKP 1 7 JMP 25 8 SET 3, *6 9 ADD 4, *6, 1 10 SUB 2, *5, *4 11 SKP 1 12 JMP 14 13 JMP 20 14 SUB 2, **3, **4 15 SKP 1 16 JMP 18 17 SET 3, *4 18 ADD 4, *4, 1 19 JMP 10 20 SET 2, **5 21 SET *5, **3 22 SET *3, *2 23 SUB 5, *5, 1 24 JMP 5 25 NOP ================================================================================ EXAMPLE PROGRAM EXECUTION ================================================================================ Memory Set up: The user enteres 4 and 10 in response to the first two instructions. Memory Map |00|01|02|03|04|05|06|07|08|09|10|11|12|13|14|15|16|17|18|19| |==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==| | | | | | | | | | | | 4| 7| 6| 3| | | | | | | | | 0| | | |14|10| 4| | | | | | | | | | | | | |==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==| AFTER INST 3 | | 0|97|10|11|13| | | | | | | | | | | | | | | | | 1| 2|11|12| | | | | | | | | | | | | | | | | | 0|97| | | | | | | | | | | | | | | | | | | | 0| | | | | | | | | | | | | | | | | | | | | 1| | | | | | | | | | | | | | | | | | | | | 0| | | | | | | | | | | | | | | | | | | |==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==| INST 19 | | 0| 1| |13| | | | | | | | | | | | | | | | | | 0| 1| | | | | | | | | | | | | | | | | | | | 0| | | | | | | | | | | | | | | | | | | |==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==| INST 19 | | 0| 0| |14| | | | | | | | | | | | | | | | | | 0| 4| | | | | | | | | | | | | | | | | | | | 0| | | | | | | | | | | | | | | | | | | |==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==| INST 19 | | 1|99| | |12| | | | | | 3| | 7| | | | | | | | | 0| 3| | | | | | | | | | | | | | | | | | |==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==| INST 24 | | 1|98|10|11| | | | | | | | | | | | | | | | | | 0| 1| |12| | | | | | | | | | | | | | | | | | 0| 1| | | | | | | | | | | | | | | | | | | | 0| | | | | | | | | | | | | | | | | | | | | 0| | | | | | | | | | | | | | | | | | | |==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==| INST 19 | | 0| | | | | | | | | | | | | | | | | | | | | 0| 0|12|13| | | | | | | | | | | | | | | | | | 1|98| | | | | | | | | | | | | | | | | | | | 0| | | | | | | | | | | | | | | | | | | |==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==| INST 19 | | 1|99| | |11| | | | | | | 6| | | | | | | | | | 0| 6| | | | | | | | | | 6| | | | | | | | |==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==| INST 24 | | 1|99|10|11| | | | | | | | | | | | | | | | | | 0| 0| |12| | | | | | | | | | | | | | | | | | 0| 1| | | | | | | | | | | | | | | | | | | | 0| | | | | | | | | | | | | | | | | | | | | 0| | | | | | | | | | | | | | | | | | | |==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==| INST 19 | | 1|99| | |10| | | | | 3| 4| | | | | | | | | | | 0| 3| | | | | | | | | | | | | | | | | | |==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==| INST 24 | | 0| 0| | | | | | | | | | | | | | | | | | |==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==|==| INST 25 | | | | | | | | | | | | | | | | | | | | | | | 0| 0|11|12|10|10| 4| | | 3| 4| 6| 7| | | | | | | FINAL | | | | | | | | | | | | | | | | | | | | |