style: format arrays
This commit is contained in:
parent
2fab257d1f
commit
b65b5838f7
1 changed files with 53 additions and 53 deletions
106
README.md
106
README.md
|
|
@ -38,27 +38,27 @@ All computation happens inside registers - RAM just holds the data until it’s
|
||||||
|
|
||||||
#### Special registers
|
#### Special registers
|
||||||
|
|
||||||
| 64-bit | 32-bit | 16-bit | Name | Purpose |
|
| 64-bit | 32-bit | 16-bit | Name | Purpose |
|
||||||
|--------|--------|--------|------|---------|
|
|----------|----------|---------|---------------------|---------------------------------------------------------|
|
||||||
| `rsp` | `esp` | `sp` | Stack Pointer | Points to the top of the stack |
|
| `rsp` | `esp` | `sp` | Stack Pointer | Points to the top of the stack |
|
||||||
| `rbp` | `ebp` | `bp` | Base Pointer | Marks the base of the current stack frame |
|
| `rbp` | `ebp` | `bp` | Base Pointer | Marks the base of the current stack frame |
|
||||||
| `rip` | `eip` | `ip` | Instruction Pointer | Points to the next instruction to execute |
|
| `rip` | `eip` | `ip` | Instruction Pointer | Points to the next instruction to execute |
|
||||||
| `rflags` | `eflags` | `flags` | Flags Register | Stores CPU state flags (zero, carry, sign, overflow...) |
|
| `rflags` | `eflags` | `flags` | Flags Register | Stores CPU state flags (zero, carry, sign, overflow...) |
|
||||||
|
|
||||||
#### General-purpose registers
|
#### General-purpose registers
|
||||||
|
|
||||||
| 64-bit | 32-bit | 16-bit | 8-bit high | 8-bit low | Category | Conventional use |
|
| 64-bit | 32-bit | 16-bit | 8-bit high | 8-bit low | Category | Conventional use |
|
||||||
|--------|--------|--------|------------|-----------|----------|-----------------|
|
|-------------|---------------|---------------|------------|---------------|--------------|---------------------------|
|
||||||
| `rax` | `eax` | `ax` | `ah` | `al` | Caller-saved | Return value, accumulator |
|
| `rax` | `eax` | `ax` | `ah` | `al` | Caller-saved | Return value, accumulator |
|
||||||
| `rbx` | `ebx` | `bx` | `bh` | `bl` | Callee-saved | General purpose |
|
| `rbx` | `ebx` | `bx` | `bh` | `bl` | Callee-saved | General purpose |
|
||||||
| `rcx` | `ecx` | `cx` | `ch` | `cl` | Caller-saved | 4th argument |
|
| `rcx` | `ecx` | `cx` | `ch` | `cl` | Caller-saved | 4th argument |
|
||||||
| `rdx` | `edx` | `dx` | `dh` | `dl` | Caller-saved | 3rd argument |
|
| `rdx` | `edx` | `dx` | `dh` | `dl` | Caller-saved | 3rd argument |
|
||||||
| `rsi` | `esi` | `si` | - | `sil` | Caller-saved | 2nd argument |
|
| `rsi` | `esi` | `si` | - | `sil` | Caller-saved | 2nd argument |
|
||||||
| `rdi` | `edi` | `di` | - | `dil` | Caller-saved | 1st argument |
|
| `rdi` | `edi` | `di` | - | `dil` | Caller-saved | 1st argument |
|
||||||
| `r8` | `r8d` | `r8w` | - | `r8b` | Caller-saved | 5th argument |
|
| `r8` | `r8d` | `r8w` | - | `r8b` | Caller-saved | 5th argument |
|
||||||
| `r9` | `r9d` | `r9w` | - | `r9b` | Caller-saved | 6th argument |
|
| `r9` | `r9d` | `r9w` | - | `r9b` | Caller-saved | 6th argument |
|
||||||
| `r10`–`r11` | `r10d`–`r11d` | `r10w`–`r11w` | - | `r10b`–`r11b` | Caller-saved | Scratch |
|
| `r10`–`r11` | `r10d`–`r11d` | `r10w`–`r11w` | - | `r10b`–`r11b` | Caller-saved | Scratch |
|
||||||
| `r12`–`r15` | `r12d`–`r15d` | `r12w`–`r15w` | - | `r12b`–`r15b` | Callee-saved | General purpose |
|
| `r12`–`r15` | `r12d`–`r15d` | `r12w`–`r15w` | - | `r12b`–`r15b` | Callee-saved | General purpose |
|
||||||
|
|
||||||
> Writing to a 32-bit register (e.g. `eax`) zeroes the upper 32 bits of its 64-bit counterpart (`rax`).
|
> Writing to a 32-bit register (e.g. `eax`) zeroes the upper 32 bits of its 64-bit counterpart (`rax`).
|
||||||
> Writing to a 16-bit or 8-bit register leaves the upper bits unchanged.
|
> Writing to a 16-bit or 8-bit register leaves the upper bits unchanged.
|
||||||
|
|
@ -85,40 +85,40 @@ All computation happens inside registers - RAM just holds the data until it’s
|
||||||
|
|
||||||
##### Conditional jumps
|
##### Conditional jumps
|
||||||
|
|
||||||
| Instruction | Flags | Condition | Description |
|
| Instruction | Flags | Condition | Description |
|
||||||
|-------------|-------|-----------|-------------|
|
|---------------|------------|--------------|---------------------------|
|
||||||
| `jmp` | - | always | Unconditional jump |
|
| `jmp` | - | always | Unconditional jump |
|
||||||
| `je` / `jz` | ZF | ZF = 1 | Equal / Zero |
|
| `je` / `jz` | ZF | ZF = 1 | Equal / Zero |
|
||||||
| `jne` / `jnz` | ZF | ZF = 0 | Not equal / Not zero |
|
| `jne` / `jnz` | ZF | ZF = 0 | Not equal / Not zero |
|
||||||
| `jo` | OF | OF = 1 | Overflow |
|
| `jo` | OF | OF = 1 | Overflow |
|
||||||
| `jno` | OF | OF = 0 | No overflow |
|
| `jno` | OF | OF = 0 | No overflow |
|
||||||
| `js` | SF | SF = 1 | Sign (negative) |
|
| `js` | SF | SF = 1 | Sign (negative) |
|
||||||
| `jns` | SF | SF = 0 | No sign (positive) |
|
| `jns` | SF | SF = 0 | No sign (positive) |
|
||||||
| `jg` | ZF, SF, OF | ZF=0 ∧ SF=OF | Greater (signed) |
|
| `jg` | ZF, SF, OF | ZF=0 ∧ SF=OF | Greater (signed) |
|
||||||
| `jge` | SF, OF | SF = OF | Greater or equal (signed) |
|
| `jge` | SF, OF | SF = OF | Greater or equal (signed) |
|
||||||
| `jl` | SF, OF | SF ≠ OF | Less (signed) |
|
| `jl` | SF, OF | SF ≠ OF | Less (signed) |
|
||||||
| `jle` | ZF, SF, OF | ZF=1 ∨ SF≠OF | Less or equal (signed) |
|
| `jle` | ZF, SF, OF | ZF=1 ∨ SF≠OF | Less or equal (signed) |
|
||||||
| `ja` | CF, ZF | CF=0 ∧ ZF=0 | Above (unsigned) |
|
| `ja` | CF, ZF | CF=0 ∧ ZF=0 | Above (unsigned) |
|
||||||
| `jae` | CF | CF = 0 | Above or equal (unsigned) |
|
| `jae` | CF | CF = 0 | Above or equal (unsigned) |
|
||||||
| `jb` | CF | CF = 1 | Below (unsigned) |
|
| `jb` | CF | CF = 1 | Below (unsigned) |
|
||||||
| `jbe` | CF, ZF | CF=1 ∨ ZF=1 | Below or equal (unsigned) |
|
| `jbe` | CF, ZF | CF=1 ∨ ZF=1 | Below or equal (unsigned) |
|
||||||
|
|
||||||
#### Arithmetic
|
#### Arithmetic
|
||||||
|
|
||||||
| Instruction | Description |
|
| Instruction | Description |
|
||||||
|-------------|-------------|
|
|-----------------|-------------------------------------------------------------|
|
||||||
| `add dst, src` | dst = dst + src |
|
| `add dst, src` | dst = dst + src |
|
||||||
| `sub dst, src` | dst = dst - src |
|
| `sub dst, src` | dst = dst - src |
|
||||||
| `inc dst` | dst = dst + 1 |
|
| `inc dst` | dst = dst + 1 |
|
||||||
| `dec dst` | dst = dst - 1 |
|
| `dec dst` | dst = dst - 1 |
|
||||||
| `imul dst, src` | dst = dst * src (signed) |
|
| `imul dst, src` | dst = dst * src (signed) |
|
||||||
| `mul src` | rax * src → rdx:rax (unsigned) |
|
| `mul src` | rax * src → rdx:rax (unsigned) |
|
||||||
| `idiv src` | rdx:rax / src → rax (quotient), rdx (remainder) (signed) |
|
| `idiv src` | rdx:rax / src → rax (quotient), rdx (remainder) (signed) |
|
||||||
| `div src` | rdx:rax / src → rax (quotient), rdx (remainder) (unsigned) |
|
| `div src` | rdx:rax / src → rax (quotient), rdx (remainder) (unsigned) |
|
||||||
| `neg dst` | dst = -dst |
|
| `neg dst` | dst = -dst |
|
||||||
| `and dst, src` | dst = dst AND src |
|
| `and dst, src` | dst = dst AND src |
|
||||||
| `or dst, src` | dst = dst OR src |
|
| `or dst, src` | dst = dst OR src |
|
||||||
| `xor dst, src` | dst = dst XOR src (used to zero a register when dst == src) |
|
| `xor dst, src` | dst = dst XOR src (used to zero a register when dst == src) |
|
||||||
|
|
||||||
### System call
|
### System call
|
||||||
|
|
||||||
|
|
@ -158,10 +158,10 @@ Additional arguments are pushed onto the stack. The return value is stored in `r
|
||||||
|
|
||||||
**Register preservation:**
|
**Register preservation:**
|
||||||
|
|
||||||
| Type | Registers | Who saves | Behavior |
|
| Type | Registers | Who saves | Behavior |
|
||||||
|------|-----------|-----------|----------|
|
|--------------|-----------------------------------------------|-----------|------------------------------------------------------------------------------------|
|
||||||
| Caller-saved | `rax`, `rcx`, `rdx`, `rsi`, `rdi`, `r8`–`r11` | Caller | **Will be overwritten** by the called function - save them before `call` if needed |
|
| Caller-saved | `rax`, `rcx`, `rdx`, `rsi`, `rdi`, `r8`–`r11` | Caller | **Will be overwritten** by the called function - save them before `call` if needed |
|
||||||
| Callee-saved | `rbx`, `rbp`, `r12`–`r15` | Callee | Must be restored before returning |
|
| Callee-saved | `rbx`, `rbp`, `r12`–`r15` | Callee | Must be restored before returning |
|
||||||
|
|
||||||
#### Structure of a function
|
#### Structure of a function
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue