mirror of
https://github.com/simon987/Much-Assembly-Required.git
synced 2025-04-20 19:16:43 +00:00
Created CPU (markdown)
parent
955221bff6
commit
21368bced0
95
CPU.md
Normal file
95
CPU.md
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
# Central processing unit (CPU)
|
||||||
|
Work in progress
|
||||||
|
|
||||||
|
## CPU Architecture
|
||||||
|
|
||||||
|
Work in progress
|
||||||
|
|
||||||
|
|
||||||
|
## Random-access memory
|
||||||
|
|
||||||
|
Work in progress
|
||||||
|
|
||||||
|
|
||||||
|
## General purpose registers
|
||||||
|
The registers are 16-bits locations available to the CPU and are used in some instructions and system calls. Read [Basic Assembly Tutorial](https://github.com/simon987/Much-Assembly-Required-3/wiki/Basic-Assembly-tutorial) for more information.
|
||||||
|
|
||||||
|
| Register | Purpose |
|
||||||
|
| -------- | ------- |
|
||||||
|
| **A** | General |
|
||||||
|
| **B** | General |
|
||||||
|
| **C** | General |
|
||||||
|
| **D** | General |
|
||||||
|
| **X** | General |
|
||||||
|
| **Y** | General |
|
||||||
|
| **BP** | Base pointer |
|
||||||
|
| **SP** | Stack Pointer |
|
||||||
|
|
||||||
|
Read [Basic Assembly Tutorial](https://github.com/simon987/Much-Assembly-Required/wiki/Basic-Assembly-tutorial) for more information about the BP & SP registers and the stack.
|
||||||
|
|
||||||
|
## The FLAGS register
|
||||||
|
The FLAGS register holds the **status** - information about the last executed instruction - of the CPU. The FLAGS register cannot be read or written directly. There are 5 flags that can modified or read by instructions (Read [Instruction set](https://github.com/simon987/Much-Assembly-Required/wiki/Instruction-set) to learn which instructions modifies the FLAGS register):
|
||||||
|
|
||||||
|
| Flag | Description |
|
||||||
|
|:--------- |:----------- |
|
||||||
|
| **CF** (Carry flag) | Relevent for *unsigned* operations. Indicates that there was a carry out of the most significant (leftmost) bit |
|
||||||
|
| **ZF** (Zero flag) | Indicates that the result of an operation is 0 |
|
||||||
|
| **SF** (Sign flag) | Indicates that the most significant (leftmost) bit of the result of an operation is set |
|
||||||
|
| **OF** (Overflow flag) | Relevent for *signed* operations. Indicates that the sign of the result of an signed operation is wrong (See exemples below) |
|
||||||
|
| **BF** (Break flag) | Tells the CPU to stop the execution. This flag is set with the **BRK** instruction. |
|
||||||
|
|
||||||
|
### Carry Flag
|
||||||
|
The carry flag is set when there is a carry out of the destination's most significant bit
|
||||||
|
|
||||||
|
For example:
|
||||||
|
```
|
||||||
|
+ 1111 1111 1111 1111 # Signed:-1 Unsigned: 65535
|
||||||
|
0000 0000 0000 0001 # Signed: 1 Unsigned: 1
|
||||||
|
-------------------
|
||||||
|
0000 0000 0000 0000
|
||||||
|
```
|
||||||
|
Note that the result of the result of the previous operation is perfectly valid for signed numbers (See [Basic Assembly Tutorial](https://github.com/simon987/Much-Assembly-Required/wiki/Basic-Assembly-tutorial)) but it is invalid for unsigned operations.
|
||||||
|
|
||||||
|
|
||||||
|
### Sign flag
|
||||||
|
The sign flag is set when the most significant (leftmost) bit of the result of an operation is set.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
```
|
||||||
|
+ 0100 0000 0000 0000 # Signed: 16384 Unsigned: 16384
|
||||||
|
0100 0000 0000 0000 # Signed: 16384 Unsigned: 16384
|
||||||
|
-------------------
|
||||||
|
1000 0000 0000 0000 # Signed:-32768 Unsigned: 32768
|
||||||
|
^
|
||||||
|
Sign flag is set
|
||||||
|
```
|
||||||
|
|
||||||
|
### Overflow flag
|
||||||
|
The carry flag is set when the signed two's complement result of an operation does not fit in the destination, or more specifically, when there is a carry/borrow **into** or **out** of the most significant (leftmost) bit, **but not both**.
|
||||||
|
The overflow flag is set when the result of an addition of two positive numbers is negative or when the result of an addition of two negative numbers is positive.
|
||||||
|
|
||||||
|
For example:
|
||||||
|
```
|
||||||
|
There is a carry out of the most significant (leftmost) bit, OF is set.
|
||||||
|
v
|
||||||
|
+ 1111 1111 1111 1111 # Signed:-1 Unsigned: 65535
|
||||||
|
1000 0000 0000 0000 # Signed:-32768 Unsigned: 32768
|
||||||
|
-------------------
|
||||||
|
0111 1111 1111 1111 # Signed: 32768 Unsigned: 32768
|
||||||
|
|
||||||
|
There is a carry out of the most significant bit
|
||||||
|
\ There is also a carry into the most significant bit, OF is not set
|
||||||
|
VV
|
||||||
|
+ 1111 1111 1111 1111
|
||||||
|
1100 0000 0000 0000
|
||||||
|
-------------------
|
||||||
|
1111 1111 1111 1111
|
||||||
|
|
||||||
|
There is also a carry into the most significant bit, OF is set
|
||||||
|
V
|
||||||
|
+ 0100 0000 0000 0000
|
||||||
|
0100 0000 0000 0000
|
||||||
|
-------------------
|
||||||
|
1000 0000 0000 0000
|
||||||
|
|
||||||
|
```
|
Loading…
x
Reference in New Issue
Block a user