def input_output_ins(self): if self.opcode == 'IN': # Input from port into AL or AX. IN AX, 4; IN AL, 7; # And we are not restricted to AL and AX, you can input to all regs. port = to_decimal(self.opd[1]) val = to_decimal(input(f"Input to Port {port}: ")) self.write_reg(self.opd[0], val) elif self.opcode == 'OUT': # Output from AL or AX to port. OUT 4, AX; OUT DX, AX # And we are not restricted to AL and AX, you can output from all regs. # If port > 255, use DX. port = self.get_int(self.opd[0]) val = self.read_reg(self.opd[1]) print(f"Port {port} output: {hex(val)}") else: sys.exit("operation code not support")
def get_int(self, opd): # 自动获取操作数值 # 若opd为int也作为地址访问 if isinstance(opd, int): opd = '[' + str(opd) + ']' # 寄存器 if self.is_reg(opd): res = self.read_reg(opd) # 内存 elif '[' in opd: if self.opbyte == 1: res_list = self.__get_byte(opd) elif self.opbyte == 2: res_list = self.__get_word(opd) elif self.opbyte == 4: res_list = self.__get_dword(opd) else: sys.exit("Opbyte Error") res = 0 print(res_list) assert res_list, "Empty memory space" for num in res_list: res = (res << 8) + int(num, 16) print("res = ", res) # 立即数 else: res = to_decimal(opd) print("get_int", hex(res), "from", opd) return res
def get_offset(self, opd): # 解析所有内存寻址:直接、寄存器间接、基址、变址、基址变址、相对基址变址 # lea 0x3412:0x34; lea [si+bx]; lea 0x12; lea ss:offset; lea [bx][di] adr_reg = ['BX', 'SI', 'DI', 'BP'] seg_reg = ['DS', 'CS', 'SS', 'ES'] opd = opd.split(':')[-1] # 去掉段前缀 par_list = [s for s in re.split('\W', opd) if s] offset = 0 for par in par_list: if par in adr_reg: offset += self.read_reg(par) elif par in seg_reg: pass else: offset += to_decimal(par) return offset
def get_address(self, opd): # 解析所有内存寻址:直接、寄存器间接、基址、变址、基址变址、相对基址变址 adr_reg = ['BX', 'SI', 'DI', 'BP'] seg_reg = ['DS', 'CS', 'SS', 'ES'] par_list = [s for s in re.split('\W', opd) if s] address = 0 has_seg = False for par in par_list: if par in adr_reg: address += self.read_reg(par) elif par in seg_reg: address += self.read_reg(par) << 4 has_seg = True else: address += to_decimal(par) if not has_seg: if 'BP' in par: # 存在BP时默认段寄存器为 address += self.read_reg('SS') << 4 else: address += self.read_reg('DS') << 4 print("Get Address", hex(address), "from opd", opd) return address
def to_int_str(matched): string = matched.group().strip(' ,') print("string = ", string) int_str = str(to_decimal(string)) print("int_str = ", int_str) return int_str + ','
for s in item: store_list.append(hex(ord(s))) else: sys.exit("Compile Error: str to hex") return store_list a = list(range(5)) print(a) for i, v in enumerate(a): if v == 3: a[i] = 4 print(a) print(to_decimal(0x123)) print(to_decimal('0x123')) print(to_decimal(hex(123))) print(hex(to_decimal('7123h'))) print(int(0x2000)) reg = { # Data Register 'AX': 0, 'BX': 0, 'CX': 0, 'DX': 0, # Pointer Register 'SP': 0, 'BP': 0, # Index Register