sd-8516_assembly_language
Differences
This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| sd-8516_assembly_language [2026/01/29 11:49] – appledog | sd-8516_assembly_language [2026/01/29 12:09] (current) – appledog | ||
|---|---|---|---|
| Line 173: | Line 173: | ||
| - | == Lesson | + | == Lesson |
| - | * Lesson | + | * Lesson |
| - | * Time: 5 min | + | * Time: 5-10 min |
| - | * Learn: | + | * Learn: |
| - | Tying everything together, what do you think this program does? | + | The problem with computer science is that sometimes |
| - | | + | === AND |
| - | LDB [$02] | + | AND is a classic logic gate. When two signals are 1, it shows result 1. I.E. 1 and 1 is 1. If one of the signals is down (like, an actual electrical signal in a wire) then the result is zero. This is OFTEN but not always an analogy for a light switch. There is always power in your house (A is 1) but only when the switch is ON (=1) is the light on. So you need 1 power and 1 switch and when they are both ON, then the light is ON. If they are both off, then what happens? Nothing! Absolutely nothing! Watch: |
| - | | + | |
| - | JZ @equal | + | |
| + | LDB 1 | ||
| + | | ||
| | | ||
| - | not_equal: | + | |
| - | | + | |
| - | | + | AND C, D ; |
| | | ||
| - | equal: | + | LDE 0 |
| - | | + | |
| - | | + | AND E, F ; E is now 0 (one of the switches is off). |
| + | | ||
| + | | ||
| + | LDI 0 | ||
| + | AND G, I ; | ||
| - | The program loads the word (two bytes) at $00 ($00 and $01) into A, and the word at $02 ($02 and $03) into B. Then it compares them. If they are equal, the zero flag is set. Depending on this we set our return code, which here by convention is C. But it could be anything. We have thus demonstrated the ability | + | And is often displayed as an easy to read table: |
| + | | | ||
| + | | | 0 | 1 | | ||
| + | | 0 | 0 | 0 | | ||
| + | | 1 | 0 | 1 | | ||
| - | CMP is the fundamental flow control operation. Compare two registers and JZ if equal. Fall-through is the not-equal case. You could also use JNZ instead and fall-through the "is equal" | + | The AND means "result 1, only when x AND y are 1". |
| + | === Binary | ||
| + | Now wrap your head around the power of binary! | ||
| + | LDA 0b01000111 | ||
| + | LDD 0b00010110 | ||
| + | AND A, D ; A is now what? 0b00000110 | ||
| + | The bits in A that were also set in D remain. The bits that weren' | ||
| + | |||
| + | LDA 0b01000111 | ||
| + | LDD 0b00000100 | ||
| + | AND A, D ; A is now 0b00000100 | ||
| + | JNZ @bit_3_is_set | ||
| + | JZ @bit_3_is_not_set | ||
| + | |||
| + | Since if bit 3 is not set, AND A, D produces a zero, you can branch flow control based on bits. So for example, if your CPU has a " | ||
| | | ||
| + | Other commands that work in a similar way are OR, XOR, and NOT. | ||
| + | |||
| + | === OR | ||
| + | OR works by saying "Set the bit if either A or B is set." So it will be 1 unless both are zero. Thats useful for detecting thieves. If any one of the laser traps detect a thief, the alarm has to go off. Not all of them at once, but any one, anywhere, and the alarms go off! That's how OR works. | ||
| + | |||
| + | === XOR | ||
| + | XOR is " | ||
| + | |||
| + | * 0b00010001 | ||
| + | * 0b00010010 | ||
| + | * XOR | ||
| + | * 0b00000011 | ||
| + | |||
| + | The bits that were the same are 0, the bits that are diffrent are 1. Please don't ask me why this is useful, i'm sure i'll remember why later. Ha. | ||
| + | |||
| + | === NOT | ||
| + | Finally, NOT. Not inverts a number. | ||
| + | * 0b00000001 ; This is a 1. | ||
| + | * NOT | ||
| + | * 0b11111110; This is 254 in decimal or FE in hex. Commonly written as #254 or $FE in assembler convention. Or 0xFE. Or FEh. | ||
| + | |||
| + | Why is NOT useful? NOT gives you the negative version minus one. So to make a number negative. NOT it and add one. In the case of 1, this is FF. This means you had a zero, subtracted one, and it //rolled over// to FF. So FF is negative one! We will explain negative numbers later. For now, FF is 255. Not -1. But, well, that's what NOT is for. | ||
| + | |||
| + | === The End of the Boring Lesson | ||
| + | If this lesson was confusing I'm sorry. The fact is you're not going to understand binary logic until later when you see it in action and see how it actually is used. For now, just try to remember the basic ideas. Or, failing that, just remember that there is an AND, and OR, an XOR, and a NOT. Everything else is based on those. | ||
| + | | ||
| == Appendix I: Registers | == Appendix I: Registers | ||
| There are sixteen general purpose registers available for use> Here they are, with a short comment on name and purpose. Of course, since they' | There are sixteen general purpose registers available for use> Here they are, with a short comment on name and purpose. Of course, since they' | ||
sd-8516_assembly_language.1769687344.txt.gz · Last modified: by appledog
