コード例 #1
0
ファイル: assembler.py プロジェクト: boo-aboutme/Docita
 def _1reg_simm6_inst(self, op1, reg, imm):
     """
     レジスタオペランド1個とリテラル(simm6)1個持つ形式の命令
     (op1 = 0b101, 0b110, 0b111)
     """
     pd, rd = self.is_reg(reg)
     pv, val = self.is_immediate(imm)
     if not pd:
         raise OperandError(reg, "destination register error")
     if (not pv) or (val > 0b111111):
         raise OperandError(imm, "immediate operand error")
     word = ((op1 << 9) | (rd << 6) | (val << 0))
     self.append(word)
コード例 #2
0
ファイル: assembler.py プロジェクト: boo-aboutme/Docita
 def _load_inst(self, op1, op2, dest, src):
     """
     ロード命令 (lda/ldp, %rd, [%rs]) %rd <- mem[%rs]
     """
     rd, rs = 0, 0           # レジスタ番号
     pd, ps = False, False   # オペランドがレジスタかどうか
     pd, rd = self.is_reg(dest)
     ps, rs = self.is_ind_addr(src)
     if not pd:
         raise OperandError(dest, "destination register error")
     if not ps:
         raise OperandError(src, "source register error")
     word = ((op1 << 9) | (rd << 6) | (op2 << 3) | (rs << 0))
     self.append(word)
コード例 #3
0
ファイル: assembler.py プロジェクト: boo-aboutme/Docita
 def _2reg_inst(self, op1, op2, dest, src):
     """
     レジスタオペランドを2個持つ形式の命令 (op1 = 0b000, 0b001, 0b010)
     """
     rd, rs = 0, 0           # レジスタ番号
     pd, ps = False, False   # オペランドがレジスタかどうか
     pd, rd = self.is_reg(dest)
     ps, rs = self.is_reg(src)
     if not pd:
         raise OperandError(dest, "destination register error")
     if not ps:
         raise OperandError(src, "source register error")
     word = ((op1 << 9) | (rd << 6) | (op2 << 3) | (rs << 0))
     self.append(word)
コード例 #4
0
ファイル: assembler.py プロジェクト: boo-aboutme/Docita
 def _store_inst(self, op1, op2, dest, src):
     """
     ストア命令 (sta/stp, [%rd], %rs) mem[%rd] <- %rs
     """
     rd, rs = 0, 0           # レジスタ番号
     pd, ps = False, False   # オペランドがレジスタかどうか
     pd, rd = self.is_ind_addr(dest)
     ps, rs = self.is_reg(src)
     if not pd:
         raise OperandError(dest, "destination register error")
     if not ps:
         raise OperandError(src, "source register error")
     word = ((op1 << 9) | (rd << 6) | (op2 << 3) | (rs << 0))
     self.append(word)
コード例 #5
0
ファイル: assembler.py プロジェクト: boo-aboutme/Docita
 def _branch(self, op1, cond, disp):
     """
     条件分岐命令。分岐条件と相対分岐アドレス
     """
     pv, val = self.is_immediate(disp)
     if (not pv) or (val > 0b111111):
         raise OperandError(disp, "branch target address too far")
     word = ((op1 << 9) | (cond << 6) | (val << 0))
     self.append(word)
コード例 #6
0
ファイル: assembler.py プロジェクト: boo-aboutme/Docita
 def _ret_inst(self, op1, op2, reg):
     """
     レジスタオペランド1個のみを持つ形式の命令 (op1 = 0b011, op2 = 0b1xxxxx)
     """
     pd, rd = self.is_reg(reg)
     if not pd:
         raise OperandError(reg, "destination register error")
     word = ((op1 << 9) | (rd << 6) | (op2 << 0))
     self.append(word)