diff options
author | Rangi <remy.oukaour+rangi42@gmail.com> | 2021-08-01 14:16:24 -0400 |
---|---|---|
committer | Rangi <remy.oukaour+rangi42@gmail.com> | 2021-08-01 14:34:12 -0400 |
commit | 1aa43f0db400f13f08b8301bcb0e5d0c9460b046 (patch) | |
tree | 7e04472047e1f19cc1510dd71b42d5a85edf759d /Optimizing-assembly-code.md | |
parent | 9d2e30aa7060240475a509c566ec20b9acccdffa (diff) |
Load from an address to `sp` by ISSOtm
Diffstat (limited to 'Optimizing-assembly-code.md')
-rw-r--r-- | Optimizing-assembly-code.md | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/Optimizing-assembly-code.md b/Optimizing-assembly-code.md index 5ed248a..2ff7153 100644 --- a/Optimizing-assembly-code.md +++ b/Optimizing-assembly-code.md @@ -41,6 +41,7 @@ WikiTI's advice fully applies here: - [Increment or decrement a 16-bit register](#increment-or-decrement-a-16-bit-register) - [Add or subtract the carry flag from a 16-bit register](#add-or-subtract-the-carry-flag-from-a-16-bit-register) - [Load from an address to `hl`](#load-from-an-address-to-hl) + - [Load from an address to `sp`](#load-from-an-address-to-sp) - [Exchange two 16-bit registers](#exchange-two-16-bit-registers) - [Subtract two 16-bit registers](#subtract-two-16-bit-registers) - [Load two constants into a register pair](#load-two-constants-into-a-register-pair) @@ -1273,6 +1274,72 @@ Instead, do this: ``` +### Load from an address to `sp` + +Don't do this: + +```asm + ; 9 bytes, 12 cycles + ld a, [Address] + ld l, a + ld a, [Address+1] + ld h, a + ld sp, hl +``` + +And don't do this: + +```asm + ; 7 bytes, 10 cycles + ldh a, [hAddress] + ld l, a + ldh a, [hAddress+1] + ld h, a + ld sp, hl +``` + +And don't do this: + +```asm + ; 7 bytes, 10 cycles + ld hl, Address + ld a, [hli] + ld h, [hl] + ld l, a + ld sp, hl +``` + +(That would be applying the "[Load from an address to `hl`](#load-from-an-address-to-hl)" optimization to the first way.) + +Instead, do this: + +```asm + ; 5 bytes, 8 cycles + ld sp, Address + pop hl + ld sp, hl +``` + +Or if the address is already in `hl`, then don't do this: + +```asm + ; 4 bytes, 7 cycles + ld a, [hli] + ld h, [hl] + ld l, a + ld sp, hl +``` + +Instead, do this: + +```asm + ; 3 bytes, 7 cycles + ld sp, hl + pop hl + ld sp, hl +``` + + ### Exchange two 16-bit registers (The example uses `hl` and `de`, but any pair of `bc`, `de`, or `hl` would also work.) |