The aim of this challenge is to implement a Bubble sort algorithm on a list of 10 values using LMC.
We will be using our online LMC simulator to test our code
online LMC simulator:
LMC SimulatorOpen in New Window
init LDA v0 STA 90 LDA v1 STA 91 LDA v2 STA 92 LDA v3 STA 93 LDA v4 STA 94 LDA v5 STA 95 LDA v6 STA 96 LDA v7 STA 97 LDA v8 STA 98 LDA v9 STA 99 loop LDA true STA sorted LDA first STA pos ADD one STA next step LDA @pos SUB @next BRZ pass BRP swap pass LDA pos ADD one STA pos LDA next ADD one STA next LDA pos SUB last BRZ repeat BRA step swap LDA @next STA temp LDA @pos STA @next LDA temp STA @pos LDA false STA sorted BRA pass repeat LDA sorted SUB true BRZ exit BRA loop exit OUT HLT pos DAT next DAT temp DAT sorted DAT 0 true DAT 1 false DAT 0 one DAT 1 first DAT 90 last DAT 99 v0 DAT 32 v1 DAT 7 v2 DAT 19 v3 DAT 75 v4 DAT 21 v5 DAT 14 v6 DAT 95 v7 DAT 35 v8 DAT 61 v9 DAT 50
init INP STA 90 INP STA 91 INP STA 92 INP STA 93 INP STA 94 INP STA 95 INP STA 96 INP STA 97 INP STA 98 INP STA 99 loop LDA true STA sorted LDA first STA pos ADD one STA next step LDA @pos SUB @next BRZ pass BRP swap pass LDA pos ADD one STA pos LDA next ADD one STA next LDA pos SUB last BRZ repeat BRA step swap LDA @next STA temp LDA @pos STA @next LDA temp STA @pos LDA false STA sorted BRA pass repeat LDA sorted SUB true BRZ exit BRA loop exit OUT HLT pos DAT next DAT temp DAT sorted DAT 0 true DAT 1 false DAT 0 one DAT 1 first DAT 90 last DAT 99
Executing the Code
We will be using our online LMC simulator to test our code
online LMC simulator:
LMC SimulatorOpen in New Window
Before testing this code in the online LMC simulator, we recommend increasing the clock speed:
We also recommend turning off the log file:
This will significantly reduce the execution time. With the data given, it will still take 831 FDE cycles to sort all 10 numbers:
Code Review
Let’s review how this code was constructed:
This is done at the very start of the code in the init block:
init LDA v0 STA 90 LDA v1 STA 91 LDA v2 STA 92 LDA v3 STA 93 LDA v4 STA 94 LDA v5 STA 95 LDA v6 STA 96 LDA v7 STA 97 LDA v8 STA 98 LDA v9 STA 99
This code is using the 10 labels v1 to v9 declared at the end of the code from line 70:
v0 DAT 32 v1 DAT 7 v2 DAT 19 v3 DAT 75 v4 DAT 21 v5 DAT 14 v6 DAT 95 v7 DAT 35 v8 DAT 61 v9 DAT 50
loop LDA true STA sorted
This flag will be overwritten if when scanning through the list a swap is made. If after checking all values of the list, the “sorted” flag is still equal to true, in this case we can deduct that the list if fully sorted and hence stop iterating.
We then reset the two pointers “pos” and “next” to first two memory locations of the list (memory location 90 (first) and 91 (first ADD one).
LDA first STA pos ADD one STA next
We can now compare the two adjacent values at position “pos” and “next” (=pos+1). Note the use of indirect addressing using the @ symbol to access the values stored at the address stored at position “pos” and “next”. To compare both values we perform a SUB (subtract) operation.
If the current value (@pos) is greater then the next value (@next) then the subtraction will be positive. If both adjacent values are equal then the subtraction will be null and there is no need to swap both values (BRZ pass). If not, if the subtraction is a positive number (>0) then we will swap both values: BRP swap. If not we will move on the next section of code to pass without swapping.
step LDA @pos SUB @next BRZ pass BRP swap
To pass, we increment both pointers “pos” and “next” by 1 so that we can then repeat the process with the next two values (by branching to the “step” block of code). However, we also need to check if we have reached the end of the list (if the “next” pointer is pointing to the last value in the list. In this case we would need to check if we need to start a new iteration of the Bubble sort algorithm from the very start of the list, or whether we can stop here (if the list is already fully sorted). This check will be performed in the “repeat” block of code.
pass LDA pos ADD one STA pos LDA next ADD one STA next LDA pos SUB last BRZ repeat BRA step
Below is the code used to swap both adjacent values (at position “@pos” and “@next”). This also sets the “sorted” flag to false, to indicate that the list may not be fully sorted yet and that a new iteration of the Bubble Sort will be needed.
swap LDA @next STA temp LDA @pos STA @next LDA temp STA @pos LDA false STA sorted BRA pass
The “repeat” block of code is used to decide whether the list is fully sorted or whether a new full iteration of the list is needed to continue the sorting process. This is done by checking that the flag “sorted” is true or false. If it is true, then the list is sorted and we can stop the Bubble Sort algorithm by branching to the “exit” block of code. Otherwise we are going back to the star of the process by branching to the “loop” block of code.
repeat LDA sorted SUB true BRZ exit BRA loop
Finally, the “exit” block of code is used to inform the user that the list is now fully sorted. This is done by outputting the value 0 and stopping the process (HLT instruction).
exit OUT HLT