mirror of https://github.com/pwndbg/pwndbg.git
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
2.8 KiB
Python
70 lines
2.8 KiB
Python
from __future__ import annotations
|
|
|
|
import pwndbg.lib.disasm.helpers as bit_math
|
|
|
|
# We must import the function under test after all the mocks are imported
|
|
|
|
|
|
def test_to_signed():
|
|
assert bit_math.to_signed(0b0100_0000, 8) == 0b0100_0000
|
|
assert bit_math.to_signed(0b1000_0000, 8) == -128
|
|
|
|
assert bit_math.to_signed(0xFFFFFFFF_FFFFFFFF, 64) == -1
|
|
assert bit_math.to_signed(0x7FFFFFFF_FFFFFFFF, 64) == 0x7FFFFFFF_FFFFFFFF
|
|
|
|
assert bit_math.to_signed(0xFFFF_FFFF, 32) == -1
|
|
assert bit_math.to_signed(0x8000_0000, 32) == -(2**31)
|
|
|
|
|
|
def test_lsl():
|
|
assert bit_math.logical_shift_left(0b1000_0000, 1, 8) == 0
|
|
assert bit_math.logical_shift_left(0b0100_0000, 1, 8) == 0b1000_0000
|
|
assert bit_math.logical_shift_left(0b1111_1111, 1, 8) == 0b1111_1110
|
|
assert bit_math.logical_shift_left(0b1111_1111, 5, 8) == 0b1110_0000
|
|
|
|
|
|
def test_lsr():
|
|
assert bit_math.logical_shift_right(0b1000_0000, 1, 8) == 0b0100_0000
|
|
assert bit_math.logical_shift_right(0b0100_0000, 1, 8) == 0b0010_0000
|
|
assert bit_math.logical_shift_right(0b1111_1111, 1, 8) == 0b0111_1111
|
|
assert bit_math.logical_shift_right(0b1111_1111, 5, 8) == 0b0000_0111
|
|
# Should truncate to bit_width before operation
|
|
assert bit_math.logical_shift_right(0b1_0000_0000, 1, 8) == 0
|
|
|
|
|
|
def test_ror():
|
|
assert bit_math.rotate_right(0b1000_0001, 1, 8) == 0b1100_0000
|
|
assert bit_math.rotate_right(0b0100_0000, 1, 8) == 0b0010_0000
|
|
assert bit_math.rotate_right(0b0100_0000, 4, 8) == 0b0000_0100
|
|
assert bit_math.rotate_right(0b1111_1111, 1, 8) == 0b1111_1111
|
|
assert bit_math.rotate_right(0b1110_1111, 5, 8) == 0b0111_1111
|
|
|
|
# Should truncate to bit_width before operation
|
|
assert bit_math.rotate_right(0b1_0000_0000, 1, 8) == 0
|
|
assert bit_math.rotate_right(0b1_0111_1111, 1, 8) == 0b1011_1111
|
|
|
|
|
|
def test_asr():
|
|
# Unsigned numbers should be the same
|
|
assert bit_math.arithmetic_shift_right(0b0100_0000, 1, 8) == bit_math.logical_shift_right(
|
|
0b0100_0000, 1, 8
|
|
)
|
|
assert bit_math.arithmetic_shift_right(0xFFFF_FF, 1, 32) == bit_math.logical_shift_right(
|
|
0xFFFF_FF, 1, 32
|
|
)
|
|
assert bit_math.arithmetic_shift_right(0xFFFF_FF, 6, 32) == bit_math.logical_shift_right(
|
|
0xFFFF_FF, 6, 32
|
|
)
|
|
|
|
assert bit_math.arithmetic_shift_right(0b1000_0000, 1, 8) == -64
|
|
assert bit_math.arithmetic_shift_right(0b1000_0000, 2, 8) == -32
|
|
assert bit_math.arithmetic_shift_right(0b1000_0000, 7, 8) == -1
|
|
|
|
# Should truncate to bit_width before operation
|
|
assert bit_math.arithmetic_shift_right(0b1_0000_0000, 1, 8) == 0
|
|
assert bit_math.arithmetic_shift_right(0b1_0111_1111, 7, 8) == 0
|
|
|
|
# Unsigned number shifted
|
|
assert bit_math.arithmetic_shift_right(0x70000000_00000000, 62, 64) == 1
|
|
assert bit_math.arithmetic_shift_right(0x70000000_00000000, 63, 64) == 0
|