示例#1
0
def main():
    '''
    Entry point of script
    '''
    parser = argparse.ArgumentParser()
    parser.add_argument('file', nargs='+', help='ALD source code file')
    parser.add_argument('-v',
                        '--verbose',
                        action='count',
                        default=0,
                        help='Verbosity')
    args = parser.parse_args()
    _set_logging(args.verbose)
    try:
        assembler = Assembler(
            instruction_set=INSTRUCTION_SET,
            registers={
                'byte': BYTE_REGISTERS,
                'word': WORD_REGISTERS,
            },
        )
        for source_file in args.file:
            assembler.assemble_file(source_file)
    except AldebaranError as ex:
        logger.error(ex)
示例#2
0
def compile(name, quiet=False):
	if quiet:
		p = subprocess.Popen([MIN_CAML, "-inline", "100", name],
				stdout = subprocess.PIPE,
				stderr = subprocess.PIPE,
				shell = False)
		ret_code = p.wait()
	else:
		ret_code = subprocess.call([MIN_CAML, "-inline", "100", name])
	if ret_code == 0:
		os.system("cat {}/min-caml/libmincaml.S >> {}.s".format(ROOT, name))
		os.system("cat {}/min-caml/read.S >> {}.s".format(ROOT, name))
		asmblr = Assembler()
		asmblr.assemble(name + ".s")
	else:
		assert False, "compile error"
示例#3
0
 def setUp(self):
     self.instruction_set = [
         (0x12, instruction_set.arithmetic.ADD),
         (0x34, instruction_set.data_transfer.MOV),
         (0x56, instruction_set.jump.JMP),
         (0x78, instruction_set.misc.NOP),
         (0x9A, instruction_set.misc.SHUTDOWN),
         (0xBC, instruction_set.control_flow.ENTER),
     ]
     self.assembler = Assembler(
         instruction_set=self.instruction_set,
         registers={
             'byte': BYTE_REGISTERS,
             'word': WORD_REGISTERS,
         },
     )
     logging.getLogger('assembler').setLevel(logging.CRITICAL)
示例#4
0
    def __init__(self):
        self.memory = Memory()
        self.assembler = Assembler(knew_instructions, knew_registers)
        self.linker = Linker()
        self.loader = Loader()
        self.Z80 = Operations()
        self.stack = []

        self.assembler.readFile()
        machine_code = self.assembler.assemble()
        mc_memory = self.linker.resolve(machine_code)
        self.loader.load(mc_memory, self.memory.get_memory())
        self.memory.show()
        self.p_size = len(machine_code) * 3

        self.registers = {}
        for reg in knew_registers.values():
            self.registers[reg] = 0

        self.ports = {}
        for i in range(1, 6):
            self.ports[i] = 0
示例#5
0
class TestAssembler(unittest.TestCase):
    def setUp(self):
        self.instruction_set = [
            (0x12, instruction_set.arithmetic.ADD),
            (0x34, instruction_set.data_transfer.MOV),
            (0x56, instruction_set.jump.JMP),
            (0x78, instruction_set.misc.NOP),
            (0x9A, instruction_set.misc.SHUTDOWN),
            (0xBC, instruction_set.control_flow.ENTER),
        ]
        self.assembler = Assembler(
            instruction_set=self.instruction_set,
            registers={
                'byte': BYTE_REGISTERS,
                'word': WORD_REGISTERS,
            },
        )
        logging.getLogger('assembler').setLevel(logging.CRITICAL)

    def test_instructions(self):
        opcode = self.assembler.assemble_code('''
        NOP
        NOP
        SHUTDOWN
        ''')
        expected_opcode = [
            0x78,
            0x78,
            0x9A,
        ]
        self.assertListEqual(opcode, expected_opcode)

    def test_operands(self):
        opcode = self.assembler.assemble_code('''
        MOV AX 0x1234
        NOP
        SHUTDOWN
        ''')
        expected_opcode = [0x34]
        expected_opcode += get_operand_opcode(
            Token(TokenType.WORD_REGISTER, 'AX', None))
        expected_opcode += get_operand_opcode(
            Token(TokenType.WORD_LITERAL, 0x1234, None))
        expected_opcode += [0x78]
        expected_opcode += [0x9A]
        self.assertListEqual(opcode, expected_opcode)

    def test_label_ok(self):
        opcode = self.assembler.assemble_code('''
        loop:
        NOP
        JMP loop
        SHUTDOWN
        ''')
        expected_opcode = [0x78]
        expected_opcode += [0x56]
        expected_opcode += get_operand_opcode(
            Token(TokenType.ADDRESS_WORD_LITERAL, -1, None))
        expected_opcode += [0x9A]
        self.assertListEqual(opcode, expected_opcode)

    def test_label_error(self):
        with self.assertRaises(AssemblerError):
            self.assembler.assemble_code('''
            loop:
            NOP
            JMP other_loop
            SHUTDOWN
            ''')

    def test_macro_dat_and_datn(self):
        opcode = self.assembler.assemble_code('''
        MOV AX [stuff]
        NOP
        SHUTDOWN
        stuff: .DAT 0x1234 0x56 'ABC'
        .DATN 0x05 0xFF
        .DATN 0x03 0x1234
        .DATN 0x02 'ABC'
        ''')
        expected_opcode = [0x34]
        expected_opcode += get_operand_opcode(
            Token(TokenType.WORD_REGISTER, 'AX', None))
        expected_opcode += get_operand_opcode(
            Token(
                TokenType.REL_REF_WORD,
                Reference(7, None, 'W'),
                None,
            ))
        expected_opcode += [0x78]
        expected_opcode += [0x9A]
        expected_opcode += [0x12, 0x34, 0x56, 0x41, 0x42, 0x43]
        expected_opcode += [0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
        expected_opcode += [0x12, 0x34, 0x12, 0x34, 0x12, 0x34]
        expected_opcode += [0x41, 0x42, 0x43, 0x41, 0x42, 0x43]
        self.assertListEqual(opcode, expected_opcode)

    def test_macro_dat_and_datn_error(self):
        with self.assertRaises(MacroError):
            self.assembler.assemble_code('''
            .DAT
            ''')
        with self.assertRaises(MacroError):
            self.assembler.assemble_code('''
            .DAT a
            ''')
        with self.assertRaises(MacroError):
            self.assembler.assemble_code('''
            .DATN
            ''')
        with self.assertRaises(MacroError):
            self.assembler.assemble_code('''
            .DATN 0x00
            ''')
        with self.assertRaises(MacroError):
            self.assembler.assemble_code('''
            .DATN 0x00 0x00 0x00
            ''')
        with self.assertRaises(MacroError):
            self.assembler.assemble_code('''
            .DATN a 0x00
            ''')
        with self.assertRaises(MacroError):
            self.assembler.assemble_code('''
            .DATN 'a' 0x00
            ''')
        with self.assertRaises(MacroError):
            self.assembler.assemble_code('''
            .DATN 0x00 a
            ''')

    def test_macro_const(self):
        opcode = self.assembler.assemble_code('''
        .CONST $stuff 0x1234
        .CONST $other_stuff $stuff
        MOV AX $other_stuff
        NOP
        SHUTDOWN
        ''')
        expected_opcode = [0x34]
        expected_opcode += get_operand_opcode(
            Token(TokenType.WORD_REGISTER, 'AX', None))
        expected_opcode += get_operand_opcode(
            Token(TokenType.WORD_LITERAL, 0x1234, None))
        expected_opcode += [0x78]
        expected_opcode += [0x9A]
        self.assertListEqual(opcode, expected_opcode)

    def test_macro_const_error(self):
        with self.assertRaises(MacroError):
            self.assembler.assemble_code('''
            .CONST
            ''')
        with self.assertRaises(MacroError):
            self.assembler.assemble_code('''
            .CONST $x
            ''')
        with self.assertRaises(MacroError):
            self.assembler.assemble_code('''
            .CONST a 0x00
            ''')
        with self.assertRaises(MacroError):
            self.assembler.assemble_code('''
            .CONST $x a
            ''')
        with self.assertRaises(VariableError):
            self.assembler.assemble_code('''
            .CONST $x $y
            ''')
        with self.assertRaises(VariableError):
            self.assembler.assemble_code('''
            .CONST $x 0x00
            .CONST $x 0x01
            ''')

    def test_macro_param_and_var(self):
        opcode = self.assembler.assemble_code('''
        ENTER 0x02 0x04
        .CONST $default_value 0x1234
        .PARAM $p
        .VAR $v1
        .VAR $v2 $default_value
        MOV AX $p
        MOV AX $v1
        MOV AX $v2
        NOP
        SHUTDOWN
        ''')
        expected_opcode = [0xBC]
        expected_opcode += get_operand_opcode(
            Token(TokenType.BYTE_LITERAL, 0x02, None))
        expected_opcode += get_operand_opcode(
            Token(TokenType.BYTE_LITERAL, 0x04, None))

        expected_opcode += [0x34]
        expected_opcode += get_operand_opcode(
            Token(
                TokenType.ABS_REF_REG,
                Reference('BP', -3, 'W'),
                None,
            ))
        expected_opcode += get_operand_opcode(
            Token(TokenType.WORD_LITERAL, 0x1234, None))

        expected_opcode += [0x34]
        expected_opcode += get_operand_opcode(
            Token(TokenType.WORD_REGISTER, 'AX', None))
        expected_opcode += get_operand_opcode(
            Token(
                TokenType.ABS_REF_REG,
                Reference('BP', 7, 'W'),
                None,
            ))

        expected_opcode += [0x34]
        expected_opcode += get_operand_opcode(
            Token(TokenType.WORD_REGISTER, 'AX', None))
        expected_opcode += get_operand_opcode(
            Token(
                TokenType.ABS_REF_REG,
                Reference('BP', -1, 'W'),
                None,
            ))

        expected_opcode += [0x34]
        expected_opcode += get_operand_opcode(
            Token(TokenType.WORD_REGISTER, 'AX', None))
        expected_opcode += get_operand_opcode(
            Token(
                TokenType.ABS_REF_REG,
                Reference('BP', -3, 'W'),
                None,
            ))

        expected_opcode += [0x78]
        expected_opcode += [0x9A]
        self.assertListEqual(opcode, expected_opcode)

    def test_macro_param_and_var_error(self):
        with self.assertRaises(MacroError):
            self.assembler.assemble_code('''
            .PARAM $p
            ''')
        with self.assertRaises(ScopeError):
            self.assembler.assemble_code('''
            ENTER 0x02 0x00
            .PARAM $p1
            .PARAM $p2
            ''')
        with self.assertRaises(VariableError):
            self.assembler.assemble_code('''
            ENTER 0x04 0x00
            .PARAM $p
            .PARAM $p
            ''')
示例#6
0
import sys
from utils import log
# from utils import log_debug
from assembler.assembler import Assembler

if __name__ == '__main__':
    # log_debug("sys.argv - {}".format(sys.argv))
    if len(sys.argv) == 2:
        file_name = sys.argv[1]
        assembler = Assembler(file_name)
        assembler.parse_asm_program()
        assembler.write_output_to_hack_file()
    else:
        log("usage: ")
        log("    python main.py <asm_file>")
        log("example: ")
        log("    python main.py prog.asm")
示例#7
0
class Computer:
    def __init__(self):
        self.memory = Memory()
        self.assembler = Assembler(knew_instructions, knew_registers)
        self.linker = Linker()
        self.loader = Loader()
        self.Z80 = Operations()
        self.stack = []

        self.assembler.readFile()
        machine_code = self.assembler.assemble()
        mc_memory = self.linker.resolve(machine_code)
        self.loader.load(mc_memory, self.memory.get_memory())
        self.memory.show()
        self.p_size = len(machine_code) * 3

        self.registers = {}
        for reg in knew_registers.values():
            self.registers[reg] = 0

        self.ports = {}
        for i in range(1, 6):
            self.ports[i] = 0

    def execute(self):
        index = 0
        while self.memory.get(hex(index)) is not None:
            instruction = self.memory.get(hex(index))
            first_arg = self.memory.get(hex(index + 1))
            second_arg = self.memory.get(hex(index + 2))

            if instruction == 1:  # LD
                self.Z80.LDR(first_arg, second_arg, self.registers)
            elif instruction == 2:  # IN
                self.Z80.INR(first_arg, self.registers, self.ports)
            elif instruction == 3:  # OUT
                self.Z80.OUT(first_arg, self.ports, self.registers)
            elif instruction == 4:  # PUSH
                self.Z80.PUSH(self.stack, self.registers, first_arg)
            elif instruction == 5:  # POP
                self.Z80.POP(self.stack, self.registers)
            elif instruction == 7:  # ADD
                self.Z80.ADDR(first_arg, self.registers)
            elif instruction == 8:  # SUB
                self.Z80.SUBR(first_arg, self.registers)
            elif instruction == 9:  # INC
                self.Z80.INCR(first_arg, self.registers)
            elif instruction == 10:  # DEC
                self.Z80.DECR(first_arg, self.registers)
            elif instruction == 11:  # CPL
                self.Z80.CPL(first_arg, self.registers)
            elif instruction == 12:  # NEG
                self.Z80.NEG(first_arg, self.registers)
            elif instruction == 13:  # AND
                self.Z80.AND(first_arg, self.registers)
            elif instruction == 14:  # OR
                self.Z80.OR(first_arg, self.registers)
            elif instruction == 15:  # XOR
                self.Z80.XOR(first_arg, self.registers)
            elif instruction == 16:  # RLA
                self.Z80.RLA(first_arg, self.registers)
            elif instruction == 17:  # RRA
                self.Z80.RRA(first_arg, self.registers)
            elif instruction == 20:  # SET
                self.Z80.SET(first_arg, self.registers, second_arg)
            elif instruction == 21:  # RESET
                self.Z80.RESET(first_arg, self.registers, second_arg)
            elif instruction == 26:  # HALT
                self.Z80.HALT()
            elif instruction == 27:  # ORG
                self.Z80.ORG(first_arg, self.registers)
            elif instruction == 28:  # END
                self.Z80.END()

            index += 3

        print('\nRegisters')
        names = list(knew_registers.keys())
        for key, value in self.registers.items():
            print(f'Register {names[key - 1]}: {value}')

        print('\nPorts')
        for key, value in self.ports.items():
            print(f'Port {key}: {value}')
示例#8
0
from assembler.assembler import Assembler

if __name__ == '__main__':
    assembler = Assembler('Prog.asm')
    print(assembler._raw_commands)
    print(assembler._parser._commands)
    assembler.assemble()
示例#9
0
    def run(self):

        self.role['state'] = 'CREATING'

        ldap_role = ldap_tools.to_ldap(self.role, 'OpenLDAProle')
        ret = self.inst.add_obj(ldap_role, 'roles', 'cid', throw_error=True)

        assert ret == 0

        virtue_path = 'images/non_provisioned_virtues/' + self.role[
            'id'] + '.img'
        key_path = USER_KEY_DIR + '/default-virtue-key.pem'

        valor_manager = ValorManager()

        try:

            # Create the role standby image files
            standby_roles = StandbyRoles(self.base_img_name, self.role)
            standby_roles.create_role_image_file()

            if (self.use_ssh):
                # Launch by adding a 'virtue' to RethinkDB
                valor = valor_manager.get_empty_valor()
                virtue_ip = valor_manager.add_virtue(
                    valor['address'], valor['valor_id'], self.role['id'],
                    virtue_path, True)  # send role_create=True)

                time.sleep(5)

                # Get Docker login command
                # Use the AWS Account ID of the Account which has the docker registry,
                # currently this is in the StarLab account.
                docker_cmd = subprocess.check_output(
                    shlex.split(
                        'aws ecr get-login --registry-ids {} --no-include-email '
                        '--region us-east-2'.format(AWS_ECR_ACCOUNT_NUMBER)))

                print('docker_cmd: ' + docker_cmd)

                # Run assembler
                assembler = Assembler(work_dir='{0}/.{1}_assembly'.format(
                    os.environ['HOME'], self.role['id']))
                assembler.assemble_running_vm(self.role['applicationIds'],
                                              docker_cmd, key_path, virtue_ip)

            # Create the virtue standby image files
            standby_virtues = StandbyVirtues(self.role['id'])
            standby_virtues.create_standby_virtues()

            self.role['state'] = 'CREATED'
            ldap_role = ldap_tools.to_ldap(self.role, 'OpenLDAProle')
            ret = self.inst.modify_obj('cid',
                                       self.role['id'],
                                       ldap_role,
                                       objectClass='OpenLDAProle',
                                       throw_error=True)

            assert ret == 0

        except:
            print('Error while assembling role {0}:\n{1}'.format(
                self.role['id'], traceback.format_exc()))

            self.role['state'] = 'FAILED'
            ldap_role = ldap_tools.to_ldap(self.role, 'OpenLDAProle')
            ret = self.inst.modify_obj('cid',
                                       self.role['id'],
                                       ldap_role,
                                       objectClass='OpenLDAProle',
                                       throw_error=True)
        finally:
            if valor_manager.rethinkdb_manager.get_virtue(self.role['id']):
                valor_manager.rethinkdb_manager.remove_virtue(self.role['id'])
示例#10
0
    parser.add_argument('-e',
                        '--excalibur_key',
                        type=str,
                        required=True,
                        help="Excalibur's public key")
    parser.add_argument('--user_key',
                        type=str,
                        required=True,
                        help="The user's public SSH key")
    parser.add_argument('-r', '--rethinkdb_cert', type=str, required=True)
    parser.add_argument('-n',
                        '--network_rules',
                        type=str,
                        required=True,
                        help='file containing network rules for the virtue')

    args = parser.parse_args()

    return args


if (__name__ == '__main__'):

    args = parse_args()

    assembler = Assembler()
    assembler.provision_virtue(args.username, args.virtue_id, args.base_img,
                               args.output_path, args.virtue_key,
                               args.excalibur_key, args.user_key,
                               args.rethinkdb_cert, args.network_rules)
示例#11
0
        '--work_dir',
        type=str,
        required=False,
        help=
        'Path to use as a temporary work directory. Does not have to exist.')

    args = parser.parse_args()

    return args


if (__name__ == '__main__'):

    args = parse_args()

    kwargs = {}
    if (args.elastic_node != None):
        kwargs['es_node'] = args.elastic_node
    if (args.syslog_server != None):
        kwargs['syslog_server'] = args.syslog_server
    if (args.rethink_host != None):
        kwargs['rethinkdb_host'] = args.rethink_host
    if (args.work_dir != None):
        kwargs['work_dir'] = args.work_dir

    assembler = Assembler(**kwargs)
    assembler.construct_unity(args.base_img,
                              args.output_path,
                              args.ssh_pub_key,
                              clean=True)