cs-3843: add assignment 8
280
Fall-2024/CS-3843/Assignments/8/Assignment.typ
Normal file
@ -0,0 +1,280 @@
|
|||||||
|
#show link: set text(blue)
|
||||||
|
#set text(font: "Calibri")
|
||||||
|
#show raw: set text(font: "Fira Code")
|
||||||
|
#set table.cell(breakable: false)
|
||||||
|
#set table(stroke: (x, y) => (
|
||||||
|
left: if x > 0 {
|
||||||
|
.1pt
|
||||||
|
},
|
||||||
|
top: if y == 1 {
|
||||||
|
0.5pt
|
||||||
|
} else if y > 1 {
|
||||||
|
0.1pt
|
||||||
|
},
|
||||||
|
))
|
||||||
|
|
||||||
|
#set page(margin: (y: .25in))
|
||||||
|
#let solve(solution) = {
|
||||||
|
block(
|
||||||
|
inset: 3pt,
|
||||||
|
stroke: blue + .3pt,
|
||||||
|
fill: rgb(0, 149, 255, 15%),
|
||||||
|
radius: 4pt,
|
||||||
|
)[#solution]
|
||||||
|
}
|
||||||
|
|
||||||
|
#let solvein(solution) = {
|
||||||
|
let outset = 3pt
|
||||||
|
h(outset)
|
||||||
|
box(
|
||||||
|
outset: outset,
|
||||||
|
stroke: blue + .3pt,
|
||||||
|
fill: rgb(0, 149, 255, 15%),
|
||||||
|
radius: 4pt,
|
||||||
|
)[#solution]
|
||||||
|
}
|
||||||
|
|
||||||
|
#let note(content) = {
|
||||||
|
block(
|
||||||
|
inset: 3pt,
|
||||||
|
stroke: luma(20%) + .3pt,
|
||||||
|
fill: luma(95%),
|
||||||
|
radius: 4pt,
|
||||||
|
)[#content]
|
||||||
|
}
|
||||||
|
|
||||||
|
#let notein(content) = {
|
||||||
|
let outset = 3pt
|
||||||
|
h(outset)
|
||||||
|
box(
|
||||||
|
outset: outset,
|
||||||
|
stroke: luma(20%) + .3pt,
|
||||||
|
fill: luma(95%),
|
||||||
|
radius: 4pt,
|
||||||
|
)[#content]
|
||||||
|
}
|
||||||
|
|
||||||
|
#align(center)[
|
||||||
|
= CS 3843 Computer Organization
|
||||||
|
HW 8\
|
||||||
|
#underline[Price Hiller] *|* #underline[zfp106]
|
||||||
|
]
|
||||||
|
#line(length: 100%, stroke: .25pt)
|
||||||
|
|
||||||
|
= Part A: (Refer to the appendix for help with CPU instructions)
|
||||||
|
|
||||||
|
1. Create an instruction, which #underline[moves] number 5 to register `R00`.
|
||||||
|
#solve[`MOV #5, R00`]
|
||||||
|
|
||||||
|
2. Execute the above instruction (#text(red)[You do this by double-clicking on the instruction]).
|
||||||
|
Observe the result in the *CPU Registers* view (Image 4).
|
||||||
|
|
||||||
|
3. Create an instruction, which #underline[moves] number 7 to register `R01`.
|
||||||
|
#solve[`MOV #7, R01`]
|
||||||
|
|
||||||
|
4. Execute it (#text(red)[You do this by double-clicking on the instruction]).
|
||||||
|
|
||||||
|
5. Observe the contents of `R00` and `R01` in the *CPU Registers* view (Image 4).
|
||||||
|
|
||||||
|
#solve[
|
||||||
|
#figure(
|
||||||
|
image("assets/5.png"),
|
||||||
|
caption: [Observing contents after questions 1 & 3],
|
||||||
|
) <fig-5>
|
||||||
|
]
|
||||||
|
|
||||||
|
6. Create an instruction, which #underline[adds] the contents of `R00` and `R01`.
|
||||||
|
#solve[`ADD R00, R01`]
|
||||||
|
|
||||||
|
7. Execute it.
|
||||||
|
|
||||||
|
8. Note down which register the result is put in.
|
||||||
|
#solve[The result of the `ADD` was put into `R01` with a value of `12`.]
|
||||||
|
|
||||||
|
9. Create an instruction, which #underline[pushes] the value in the above register to the top of the program stack, and then execute it. Observe the value in *Program Stack* (Image 5).
|
||||||
|
#solve[
|
||||||
|
Instruction: `PSH R01`
|
||||||
|
]
|
||||||
|
#note[
|
||||||
|
#figure(
|
||||||
|
image("assets/9-2.png"),
|
||||||
|
caption: [Current program stack],
|
||||||
|
) <fig-9-2>
|
||||||
|
]
|
||||||
|
|
||||||
|
#align(center)[#text(size: 3em)[#note[See next page]]]
|
||||||
|
|
||||||
|
#pagebreak()
|
||||||
|
|
||||||
|
10. Create an instruction to #underline[push] number 2 on top of the program stack and execute it. Observe the value in *Program Stack* (Image 5).
|
||||||
|
|
||||||
|
#solve[
|
||||||
|
Instruction: `PSH #2`
|
||||||
|
]
|
||||||
|
#note[
|
||||||
|
|
||||||
|
#figure(
|
||||||
|
image("assets/10.png"),
|
||||||
|
caption: [Current program stack],
|
||||||
|
) <fig-10>
|
||||||
|
]
|
||||||
|
|
||||||
|
11. Create an instruction to #underline[unconditionally jump] to the first instruction.
|
||||||
|
|
||||||
|
#solve[
|
||||||
|
`JMP 0`
|
||||||
|
]
|
||||||
|
|
||||||
|
12. Execute it.
|
||||||
|
|
||||||
|
13. Observe the value in the *PC* register. This is the address of the next instruction to be executed. What instruction is it pointing to?
|
||||||
|
#solve[
|
||||||
|
The *PC* register is pointing to the original `MOV` instruction created in question one
|
||||||
|
|
||||||
|
#note[
|
||||||
|
|
||||||
|
#figure(
|
||||||
|
image("assets/13.png"),
|
||||||
|
caption: [Current *PC* value],
|
||||||
|
) <fig-13>
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
|
14. Create an instruction to #underline[pop] the value on the top of the *Program Stack* into the register `R02`.
|
||||||
|
|
||||||
|
#solve[`POP R02`]
|
||||||
|
|
||||||
|
15. Execute it.
|
||||||
|
|
||||||
|
#solve[This just removed the value `2` from the stack.]
|
||||||
|
|
||||||
|
16. Create an instruction to #underline[pop] the value on top of the *Program Stack* into register `R03`.
|
||||||
|
#solve[`POP R03`]
|
||||||
|
|
||||||
|
17. Execute it.
|
||||||
|
|
||||||
|
#solve[This just removed the value `12` from the stack.]
|
||||||
|
#align(center)[#text(size: 3em)[#note[See next page]]]
|
||||||
|
|
||||||
|
#pagebreak()
|
||||||
|
|
||||||
|
18. Execute the last instruction once again. What happened? Explain.
|
||||||
|
|
||||||
|
#solve[
|
||||||
|
I received the following error message:
|
||||||
|
|
||||||
|
#figure(
|
||||||
|
image("assets/18.png"),
|
||||||
|
caption: [Stack underflow failure],
|
||||||
|
) <fig-18>
|
||||||
|
|
||||||
|
This occurred because there are no values remaining in the Program Stack. In a real assembly program, this would lead to a true underflow and cause a wrap around. The `*sp` pointer would get incremented and likely result in the _relative_ address being the value 0.
|
||||||
|
|
||||||
|
Most operating systems would kill off the process due to this underflow as a general rule of thumb. For example, on my Linux system running the following assembly on x86_64 produces a segfault:
|
||||||
|
|
||||||
|
```asm
|
||||||
|
SECTION .TEXT
|
||||||
|
GLOBAL _start
|
||||||
|
_start:
|
||||||
|
; Arbitrary register chosen that a callee controls,
|
||||||
|
; could be rdi, rax, etc.
|
||||||
|
pop r10
|
||||||
|
```
|
||||||
|
]
|
||||||
|
|
||||||
|
19. Create a #underline[compare] instruction, which compares values in registers `R04` and `R05`.
|
||||||
|
#solve[`CMP R04, R05`]
|
||||||
|
|
||||||
|
20. Manually insert two equal values in registers `R04` and `R05` (image 4).
|
||||||
|
#solve[
|
||||||
|
#figure(
|
||||||
|
image("assets/20.png"),
|
||||||
|
caption: [Equal values manually inserted],
|
||||||
|
) <fig-20>
|
||||||
|
]
|
||||||
|
|
||||||
|
21. Execute the above compare instruction.
|
||||||
|
|
||||||
|
// #pagebreak()
|
||||||
|
22. Which of the status flags *OV/Z/N* is set (i.e. box is checked)?
|
||||||
|
|
||||||
|
#solve[
|
||||||
|
The `Z` flag is set.
|
||||||
|
|
||||||
|
#figure(
|
||||||
|
image("assets/22.png"),
|
||||||
|
caption: [`Z` flag set after equal `CMP`],
|
||||||
|
) <fig-22>
|
||||||
|
]
|
||||||
|
|
||||||
|
#align(center)[#text(size: 3em)[#note[See next page]]]
|
||||||
|
#pagebreak()
|
||||||
|
|
||||||
|
23. Manually insert a value in the first register greater than that in the second register.
|
||||||
|
#solve[
|
||||||
|
#figure(
|
||||||
|
image("assets/23.png"),
|
||||||
|
caption: [Larger value in the _first_ register],
|
||||||
|
) <fig-23>
|
||||||
|
]
|
||||||
|
|
||||||
|
24. Execute the compare instruction again.
|
||||||
|
|
||||||
|
25. Which of the status flags *OV/Z/N* is set?
|
||||||
|
#solve[
|
||||||
|
The `N` flag is set.
|
||||||
|
|
||||||
|
#figure(
|
||||||
|
image("assets/25.png"),
|
||||||
|
caption: [`N` flag set after reg 1 > reg 2 `CMP`],
|
||||||
|
) <fig-25>
|
||||||
|
]
|
||||||
|
|
||||||
|
26. Manually insert a value in the first register smaller than that in the second register.
|
||||||
|
#solve[
|
||||||
|
#figure(
|
||||||
|
image("assets/26.png"),
|
||||||
|
caption: [Smaller value in the _first_ register.],
|
||||||
|
) <fig-26>
|
||||||
|
]
|
||||||
|
27. Execute the compare instruction once again.
|
||||||
|
|
||||||
|
28. Which of the status flags *OV/Z/N* is set?
|
||||||
|
#solve[
|
||||||
|
None of the flags are set.
|
||||||
|
|
||||||
|
#figure(
|
||||||
|
image("assets/28.png"),
|
||||||
|
caption: [No flags set after reg 1 < reg 2 `CMP`],
|
||||||
|
) <fig-28>
|
||||||
|
|
||||||
|
]
|
||||||
|
|
||||||
|
29. Create an instruction, which will #underline[jump] to the first instruction if the values in registers `R04` and `R05` are equal.
|
||||||
|
|
||||||
|
#solve[
|
||||||
|
```asm
|
||||||
|
CMP R04, R05
|
||||||
|
JEQ 0
|
||||||
|
```
|
||||||
|
]
|
||||||
|
|
||||||
|
30. Test the above instruction by manually putting equal values in registers `R04` and `R05`, then first executing the compare instruction followed by executing the jump instruction (*Remember*: #text(red)[You execute an instruction by double-clicking on it]). If it worked, the first instruction should be highlighted. Write your observations and what you have learned.
|
||||||
|
|
||||||
|
#note[I feel I'm not quite understanding what this question is asking for, so here's to winging it.]
|
||||||
|
#solve[
|
||||||
|
I've learned that `JEQ 0` will check the `Z` flag to see if its set. If it is, then it'll set the *PC* (Program Counter) register to the specified value.
|
||||||
|
|
||||||
|
Of particular note, `JEQ` operates very similarly to `JZR` (in fact they have the same underlying functionality), but the semantic reason for them is different. Taking a look at https://www.felixcloutier.com/x86/jcc, it becomes clear that the semantic meaning of `JEQ` is intended to be used when we're validating equality after a `CMP` instruction, whereas `JZR` is more intended for checking the `ZF` flag where non comparison instructions may set it.
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
#line(length: 100%, stroke: .25pt)
|
||||||
|
= Full Program Below
|
||||||
|
|
||||||
|
#note[As a note: I moved the _*unconditional*_ jump to the first instruction to the very end of the program.]
|
||||||
|
|
||||||
|
#figure(
|
||||||
|
image("assets/full-prog.png"),
|
||||||
|
caption: [Full progam in CPU Simulator],
|
||||||
|
) <fig-full-prog>
|
BIN
Fall-2024/CS-3843/Assignments/8/assets/10.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
Fall-2024/CS-3843/Assignments/8/assets/13.png
Normal file
After Width: | Height: | Size: 5.1 KiB |
BIN
Fall-2024/CS-3843/Assignments/8/assets/18.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
Fall-2024/CS-3843/Assignments/8/assets/20.png
Normal file
After Width: | Height: | Size: 3.3 KiB |
BIN
Fall-2024/CS-3843/Assignments/8/assets/21.png
Normal file
After Width: | Height: | Size: 9.3 KiB |
BIN
Fall-2024/CS-3843/Assignments/8/assets/22.png
Normal file
After Width: | Height: | Size: 4.9 KiB |
BIN
Fall-2024/CS-3843/Assignments/8/assets/23.png
Normal file
After Width: | Height: | Size: 3.3 KiB |
BIN
Fall-2024/CS-3843/Assignments/8/assets/25.png
Normal file
After Width: | Height: | Size: 5.0 KiB |
BIN
Fall-2024/CS-3843/Assignments/8/assets/26.png
Normal file
After Width: | Height: | Size: 3.2 KiB |
BIN
Fall-2024/CS-3843/Assignments/8/assets/28.png
Normal file
After Width: | Height: | Size: 4.7 KiB |
BIN
Fall-2024/CS-3843/Assignments/8/assets/5.png
Normal file
After Width: | Height: | Size: 9.2 KiB |
BIN
Fall-2024/CS-3843/Assignments/8/assets/9-1.png
Normal file
After Width: | Height: | Size: 8.3 KiB |
BIN
Fall-2024/CS-3843/Assignments/8/assets/9-2.png
Normal file
After Width: | Height: | Size: 11 KiB |
BIN
Fall-2024/CS-3843/Assignments/8/assets/full-prog.png
Normal file
After Width: | Height: | Size: 73 KiB |