hex.pointers.read_byte_from_inners_ptrs¶
hex.pointers.read_byte[:2] = *ptr — read one byte through the currently-set flip/jump pointers. Use after hex.pointers.set_flip_and_jump_pointers.
Signature¶
def read_byte_from_inners_ptrs @ read_ptr_and_flip_back, cleanup < hex.pointers.ret_after_read_byte, hex.pointers.read_byte, hex.pointers.to_jump, hex.pointers.to_flip { ... }
Defined in hex/pointers/xor_from_pointer.fj — lines 29–54 (view on GitHub).
Complexity¶
Time:
5@+13Space:
5@+24
See the complexity glossary for what @, w, dw, dbit, n mean.
Source¶
Click to view the macro body
def read_byte_from_inners_ptrs @ read_ptr_and_flip_back, cleanup \
< hex.pointers.ret_after_read_byte, hex.pointers.read_byte, hex.pointers.to_jump, hex.pointers.to_flip {
// 1. setup:
// zero read_byte.
// to_flip = ptr + dbit+8.
// to_jump+w = ptr.
hex.zero 2, hex.pointers.read_byte
wflip hex.pointers.to_flip, dbit+8
// 2. *(ptr+w)^=256, so that now *(ptr+w) == 256 + original_value.
wflip hex.pointers.to_flip+w, read_ptr_and_flip_back, hex.pointers.to_flip
pad 4
read_ptr_and_flip_back:
// 3. Jump to *(ptr+w). It will xor the pointed original_value byte into hex.pointers.read_byte.
// 4. Then jump to hex.pointers.to_flip to make *(ptr+w)==original_value back again.
// 5. Then return to cleanup.
wflip hex.pointers.to_flip+w, read_ptr_and_flip_back^cleanup
wflip hex.pointers.ret_after_read_byte+w, hex.pointers.to_flip, hex.pointers.to_jump
cleanup:
// 6. to_flip = ptr, clean jump-back addresses.
wflip hex.pointers.ret_after_read_byte+w, hex.pointers.to_flip
wflip hex.pointers.to_flip, dbit+8
wflip hex.pointers.to_flip+w, cleanup
}
Depends on¶
Used by¶
Example uses¶
hex.xor_hex_from_ptrinhex/pointers/xor_from_pointer.fjhex.xor_byte_from_ptrinhex/pointers/xor_from_pointer.fjhex.write_hexinhex/pointers/write_pointers.fj
← Previous: hex.xor_byte_from_ptr