Beispiel #1
0
 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")
Beispiel #2
0
 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
Beispiel #3
0
 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
Beispiel #4
0
 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
Beispiel #5
0
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 + ','
Beispiel #6
0
            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