Пример #1
0
def test_assemble_compression_alignment():
    source = r"""
    foo:
        addi x0 x0 0

    align 4
    bar:
    """
    labels = {}
    asm.assemble(source, labels=labels, compress=True)
    assert labels['bar'] == 4
Пример #2
0
def test_assembler_bytes():
    source = """
    bytes 1 2 0x03 0b100 5 0x06 0b111 8
    """
    binary = asm.assemble(source)
    target = b'\x01\x02\x03\x04\x05\x06\x07\x08'
    assert binary == target
Пример #3
0
def test_assembler_modifiers():
    source = """
    ADDR = 0x20000000

    addi zero zero 0
    addi zero zero 0
    addi zero zero 0

    main:
        # without nestable exprs under hi / lo
        lui t0 %hi ADDR
        addi t0 t0 %lo(ADDR)
        addi t0 t0 main
    
        # with nestable exprs under hi / lo
        lui t0 %hi %position main ADDR
        addi t0 t0 %lo(%position(main, ADDR))
    """
    binary = asm.assemble(source)
    target = b''.join([
        asm.ADDI(0, 0, 0),
        asm.ADDI(0, 0, 0),
        asm.ADDI(0, 0, 0),
        asm.LUI('t0', asm.relocate_hi(0x20000000)),
        asm.ADDI('t0', 't0', asm.relocate_lo(0x20000000)),
        asm.ADDI('t0', 't0', 12),
        asm.LUI('t0', asm.relocate_hi(0x20000000 + 12)),
        asm.ADDI('t0', 't0', asm.relocate_lo(0x20000000 + 12)),
    ])
    assert binary == target
Пример #4
0
def test_assemble_lui_signedness():
    source = r"""
    lui a4,0xfffff
    """
    binary = asm.assemble(source)
    target = b''.join(
        struct.pack('<I', inst) for inst in [
            asm.LUI('a4', -1),
        ])
    assert binary == target
Пример #5
0
def test_assemble_hex_register():
    source = r"""
    slli a4,a4,0xa
    """
    binary = asm.assemble(source)
    target = b''.join(
        struct.pack('<I', inst) for inst in [
            asm.SLLI('a4', 'a4', 10),
        ])
    assert binary == target
Пример #6
0
def test_assembler_string():
    source = """
    string hello
    string world
    string hello world
    string hello   world
    """
    binary = asm.assemble(source)
    target = b'helloworldhello worldhello world'
    assert binary == target
Пример #7
0
def test_assemble_string():
    source = r"""
    string hello
    string "world"
    string "hello world"
    string hello  ##  world
    string hello\nworld
    string   hello\\nworld
    """
    binary = asm.assemble(source)
    target = b'hello"world""hello world"hello  ##  worldhello\nworld  hello\\nworld'
    assert binary == target
Пример #8
0
def test_assemble_align():
    source = r"""
    addi zero zero 0
    pack <B 42
    align 4
    addi zero zero 0
    """
    binary = asm.assemble(source)
    target = b''.join([
        struct.pack('<I', asm.ADDI(0, 0, 0)),
        b'\x2a\x00\x00\x00',
        struct.pack('<I', asm.ADDI(0, 0, 0)),
    ])
    assert binary == target
Пример #9
0
def test_assembler_basic_uppercase():
    source = """
    ADDI t0 zero 1
    ADDI t1, zero, 2
    ADDI(t2, zero, 3)
    """
    binary = asm.assemble(source)
    target = b''.join([
        # can use nums OR names for registers
        asm.ADDI(5, 0, 1),
        asm.ADDI('t1', 'zero', 2),
        asm.ADDI('t2', 'zero', 3),
    ])
    assert binary == target
Пример #10
0
def test_assembler_align():
    source = """
    addi zero zero 0
    pack <B 42
    align 4
    addi zero zero 0
    """
    binary = asm.assemble(source)
    target = b''.join([
        asm.ADDI(0, 0, 0),
        b'\x2a\x00\x00\x00',
        asm.ADDI(0, 0, 0),
    ])
    assert binary == target
Пример #11
0
def test_assemble_pack():
    source = r"""
    ADDR = 0x20000000
    pack <B 0
    pack <B 255
    pack <I ADDR
    """
    binary = asm.assemble(source)
    target = b''.join([
        struct.pack('<B', 0),
        struct.pack('<B', 255),
        struct.pack('<I', 0x20000000),
    ])
    assert binary == target
Пример #12
0
def test_assembler_constants():
    source = """
    FOO = 42
    BAR = FOO * 2
    BAZ = BAR >> 1 & 0b11111
    W = 's0'
    IP = gp
    addi zero zero BAR
    addi W IP BAZ
    """
    binary = asm.assemble(source)
    target = b''.join([
        asm.ADDI(0, 0, 84),
        asm.ADDI('s0', 'gp', 10),
    ])
    assert binary == target
Пример #13
0
def test_assemble_alternate_offset_syntax_compressed():
    source = r"""
    c.lw x8, x9, 0
    c.lw x8, 0(x9)
    c.sw x8, x9, 0
    c.sw x9, 0(x8)
    """
    binary = asm.assemble(source)
    target = b''.join(
        struct.pack('<H', inst) for inst in [
            asm.C_LW('x8', 'x9', 0),
            asm.C_LW('x8', 'x9', 0),
            asm.C_SW('x8', 'x9', 0),
            asm.C_SW('x8', 'x9', 0),
        ])
    assert binary == target
Пример #14
0
def test_assemble_alternate_offset_syntax():
    source = r"""
    jalr x0, x1, 0
    jalr x0, 0(x1)
    lw x0, x1, 0
    lw x0, 0(x1)
    sb x0, x1, 0
    sb x1, 0(x0)
    """
    binary = asm.assemble(source)
    target = b''.join(
        struct.pack('<I', inst) for inst in [
            asm.JALR('x0', 'x1', 0),
            asm.JALR('x0', 'x1', 0),
            asm.LW('x0', 'x1', 0),
            asm.LW('x0', 'x1', 0),
            asm.SB('x0', 'x1', 0),
            asm.SB('x0', 'x1', 0),
        ])
    assert binary == target
Пример #15
0
def test_assemble_aq_rl():
    source = r"""
    lr.w zero zero
    sc.w zero zero zero 0 0
    sc.w zero zero zero 1 0
    sc.w zero zero zero 0 1
    sc.w zero zero zero 1 1
    amomaxu.w t0 t1 t2
    """
    binary = asm.assemble(source)
    target = b''.join(
        struct.pack('<I', inst) for inst in [
            asm.LR_W(0, 0),
            asm.SC_W(0, 0, 0, aq=0, rl=0),
            asm.SC_W(0, 0, 0, aq=1, rl=0),
            asm.SC_W(0, 0, 0, aq=0, rl=1),
            asm.SC_W(0, 0, 0, aq=1, rl=1),
            asm.AMOMAXU_W('t0', 't1', 't2'),
        ])
    assert binary == target
Пример #16
0
def test_assemble_constants():
    source = r"""
    FOO = 42
    BAR = FOO * 2
    BAZ = BAR >> 1 & 0b11111
    W = s0
    IP = gp
    addi zero zero BAR
    addi W IP BAZ

    QMARK = '?'
    addi x0 x0 QMARK
    """
    binary = asm.assemble(source)
    target = b''.join(
        struct.pack('<I', inst) for inst in [
            asm.ADDI(0, 0, 84),
            asm.ADDI('s0', 'gp', 10),
            asm.ADDI(0, 0, ord('?')),  # ord('?') == 63
        ])
    assert binary == target
Пример #17
0
def test_assembler_labels_and_jumps():
    source = """
    start:
        addi t0 zero 42
        jal zero end
    middle:
        beq t0 zero main
        addi t0 t0 -1
    end:
        jal zero %offset middle
    main:
        addi zero zero 0
    """
    binary = asm.assemble(source)
    target = b''.join([
        asm.ADDI('t0', 'zero', 42),
        asm.JAL('zero', 12),
        asm.BEQ('t0', 'zero', 12),
        asm.ADDI('t0', 't0', -1),
        asm.JAL('zero', -8),
        asm.ADDI(0, 0, 0),
    ])
    assert binary == target
Пример #18
0
def test_assemble_labels_and_jumps():
    source = r"""
    start:
        addi t0 zero 42
        jal zero end
    middle:
        beq t0 zero main
        addi t0 t0 -1
    end:
        jal zero middle
    main:
        addi zero zero 0
    """
    binary = asm.assemble(source)
    target = b''.join(
        struct.pack('<I', inst) for inst in [
            asm.ADDI('t0', 'zero', 42),
            asm.JAL('zero', 12),
            asm.BEQ('t0', 'zero', 12),
            asm.ADDI('t0', 't0', -1),
            asm.JAL('zero', -8),
            asm.ADDI(0, 0, 0),
        ])
    assert binary == target
Пример #19
0
def test_assemble_sequence(source, expected):
    binary = asm.assemble(source)
    assert binary == expected
Пример #20
0
def test_assemble_pseudo_instructions(pseudo, transformed):
    labels = {'test': 0, 'near': 0, 'far': 0x20000000}
    pseudo_bin = asm.assemble(pseudo, labels=labels)
    transformed_bin = asm.assemble(transformed, labels=labels)
    assert pseudo_bin == transformed_bin
Пример #21
0
def test_assemble_compress(regular, compressed):
    labels = {'test': 0, 'near': 0, 'far': 0x20000000}
    regular_bin = asm.assemble(regular, labels=labels, compress=True)
    compressed_bin = asm.assemble(compressed, labels=labels)
    assert regular_bin == compressed_bin
Пример #22
0
def test_assemble_shorthand_packs(shorthand, transformed):
    shorthand_bin = asm.assemble(shorthand)
    transformed_bin = asm.assemble(transformed)
    assert shorthand_bin == transformed_bin
Пример #23
0
def test_constraints(source):
    with pytest.raises(asm.AssemblerError):
        asm.assemble(source)
Пример #24
0
def test_assemble_ext_c(source, expected):
    binary = asm.assemble(source)
    target = struct.pack('<H', expected)
    assert binary == target