textx86stream.java

来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 1,306 行 · 第 1/3 页

JAVA
1,306
字号
	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writeNEG(Register)
	 */
	public void writeNEG(Register dstReg) {

		println("\tneg " + dstReg);
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writeNOP()
	 */
	public void writeNOP() {

		println("\tnop");
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writeOR(Register, int, Register)
	 */
	public void writeOR(Register dstReg, int dstDisp, Register srcReg) {

		println("\tor dword [" + dstReg + disp(dstDisp) + "]," + srcReg);
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writeOR(Register, Register)
	 */
	public void writeOR(Register dstReg, Register srcReg) {

		println("\tor " + dstReg + "," + srcReg);
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writePOP(Register, int)
	 */
	public void writePOP(Register dstReg, int dstDisp) {

		println("\tpop dword [" + dstReg + disp(dstDisp) + "]");
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writePOP(Register)
	 */
	public void writePOP(Register dstReg) {

		println("\tpop " + dstReg);
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writePUSH(int)
	 * @return The ofset of the start of the instruction.
	 */
	public int writePUSH(int imm32) {
		return println("\tpush 0x" + NumberUtils.hex(imm32));
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writePUSH(Register, int)
	 * @return The ofset of the start of the instruction.
	 */
	public int writePUSH(Register srcReg, int srcDisp) {
		return println("\tpush dword [" + srcReg + disp(srcDisp) + "]");
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writePUSH(Register, Register, int, int)
	 * @return The ofset of the start of the instruction.
	 */
	public int writePUSH(Register srcBaseReg, Register srcIndexReg, int srcScale, int srcDisp) {
		return println("\tpush dword [" + srcBaseReg + disp(srcDisp) + "+" + srcIndexReg + "*" + srcScale + "]");
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writePUSH(Register)
	 * @return The ofset of the start of the instruction.
	 */
	public int writePUSH(Register srcReg) {
		return println("\tpush " + srcReg);
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writeRET()
	 */
	public void writeRET() {

		println("\tret");
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writeRET(int)
	 */
	public void writeRET(int imm16) {

		println("\tret " + imm16);
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writeSAHF()
	 */
	public void writeSAHF() {

		println("\tsahf");
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writeSAL_CL(Register)
	 */
	public void writeSAL_CL(Register dstReg) {

		println("\tsal " + dstReg + ",cl");
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writeSAL(Register, int)
	 */
	public void writeSAL(Register dstReg, int imm8) {

		println("\tsal " + dstReg + "," + imm8);
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writeSAR_CL(Register)
	 */
	public void writeSAR_CL(Register dstReg) {

		println("\tsar " + dstReg + ",cl");
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writeSAR(Register, int)
	 */
	public void writeSAR(Register dstReg, int imm8) {

		println("\tsar " + dstReg + "," + imm8);
	}

	/**
	 * Create a SBB dstReg, imm32
	 * 
	 * @param dstReg
	 * @param imm32
	 */
	public void writeSBB(Register dstReg, int imm32) {

		println("\tsbb " + dstReg + ",0x" + NumberUtils.hex(imm32));
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writeSBB(Register, int, int)
	 */
	public void writeSBB(Register dstReg, int dstDisp, int imm32) {

		println("\tsbb dword [" + dstReg + disp(dstDisp) + "],0x" + NumberUtils.hex(imm32));
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writeSBB(Register, int, Register)
	 */
	public void writeSBB(Register dstReg, int dstDisp, Register srcReg) {

		println("\tsbb dword [" + dstReg + disp(dstDisp) + "]," + srcReg);
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writeSBB(Register, Register)
	 */
	public void writeSBB(Register dstReg, Register srcReg) {

		println("\tsbb " + dstReg + "," + srcReg);
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writeSHL_CL(Register)
	 */
	public void writeSHL_CL(Register dstReg) {

		println("\tshl " + dstReg + ",cl");
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writeSHL(Register, int)
	 */
	public void writeSHL(Register dstReg, int imm8) {

		println("\tshl " + dstReg + "," + imm8);
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writeSHLD_CL(Register, Register)
	 */
	public void writeSHLD_CL(Register dstReg, Register srcReg) {

		println("\tshld " + dstReg + "," + srcReg + ",cl");
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writeSHR_CL(Register)
	 */
	public void writeSHR_CL(Register dstReg) {

		println("\tshr " + dstReg + ",cl");
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writeSHR(Register, int)
	 */
	public void writeSHR(Register dstReg, int imm8) {

		println("\tshr " + dstReg + "," + imm8);
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writeSHRD_CL(Register, Register)
	 */
	public void writeSHRD_CL(Register dstReg, Register srcReg) {

		println("\tshrd " + dstReg + "," + srcReg + ",cl");
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writeSUB(Register, int, Register)
	 */
	public void writeSUB(Register dstReg, int dstDisp, Register srcReg) {

		println("\tsub dword [" + dstReg + disp(dstDisp) + "]," + srcReg);
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writeSUB(Register, Register)
	 */
	public void writeSUB(Register dstReg, Register srcReg) {
		println("\tsub " + dstReg + "," + srcReg);
	}

	/**
	 * Create a SUB reg, imm32
	 * 
	 * @param reg
	 * @param imm32
	 */
	public final void writeSUB(Register reg, int imm32) {
		println("\tsub " + reg + "," + imm32);
	}
	
	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writeTEST_AL(int)
	 */
	public void writeTEST_AL(int value) {

		println("\ttest al," + value);
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writeTEST_EAX(int)
	 */
	public void writeTEST_EAX(int value) {

		println("\ttest eax," + value);
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writeTEST(Register, int)
	 */
	public void writeTEST(Register reg, int imm32) {

		println("\ttest " + reg + ",0x" + NumberUtils.hex(imm32));
	}

	/**
	 * Create a TEST reg1, reg2
	 * 
	 * @param reg1
	 * @param reg2
	 */
	public void writeTEST(Register reg1, Register reg2) {

		println("\ttest " + reg1 + "," + reg2);
	}
	
	/**
	 * Create 32-bit offset relative to the current (after this offset) offset.
	 * @param label
	 */
	public void writeRelativeObjectRef(Label label) {
	    println("\tdd relative " + label);
	}
	
	/**
	 * @see org.jnode.assembler.NativeStream#writeTo(java.io.OutputStream)
	 */
	public void writeTo(OutputStream os) throws IOException {
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writeXOR(Register, int, Register)
	 */
	public void writeXOR(Register dstReg, int dstDisp, Register srcReg) {
		println("\txor dword [" + dstReg + disp(dstDisp) + "]," + srcReg);
	}

	/**
	 * @see org.jnode.assembler.x86.AbstractX86Stream#writeXOR(Register, Register)
	 */
	public void writeXOR(Register dstReg, Register srcReg) {
		println("\txor " + dstReg + "," + srcReg);
	}

	private final String operandSize(int opSize) {
		switch (opSize) {
			case BITS8 :
				return "byte";
			case BITS16 :
				return "word";
			case BITS32 :
				return "dword";
			default :
				throw new IllegalArgumentException("Unknown operant size " + opSize);
		}
	}

	private static final String ccName(int jumpOpcode) {
		final String opc;
		switch (jumpOpcode) {
			case JA :
				opc = "a";
				break;
			case JAE :
				opc = "ae";
				break;
			case JB :
				opc = "b";
				break;
			case JBE :
				opc = "be";
				break;
			case JE :
				opc = "e";
				break;
			case JNE :
				opc = "ne";
				break;
			case JLE :
				opc = "le";
				break;
			case JL :
				opc = "l";
				break;
			case JGE :
				opc = "ge";
				break;
			case JG :
				opc = "g";
				break;
			default :
				throw new RuntimeException("Unknown jump opcode " + jumpOpcode);
		}
		return opc;
	}

	class ObjectRefImpl extends NativeStream.ObjectRef {

		public ObjectRefImpl(Object object) {
			super(object);
		}

		/**
		 * @see org.jnode.assembler.NativeStream.ObjectRef#getOffset()
		 */
		public int getOffset() throws UnresolvedObjectRefException {
			return 0;
		}

		/**
		 * @see org.jnode.assembler.NativeStream.ObjectRef#isResolved()
		 */
		public boolean isResolved() {
			return true;
		}

		/**
		 * @see org.jnode.assembler.NativeStream.ObjectRef#link(org.jnode.assembler.NativeStream.ObjectRef)
		 */
		public void link(ObjectRef objectRef) throws UnresolvedObjectRefException {
		}

	}

	class ObjectInfoImpl extends NativeStream.ObjectInfo {

		/**
		 * @see org.jnode.assembler.NativeStream.ObjectInfo#markEnd()
		 */
		public void markEnd() {
			println(";\n; -- End of Object --\n;");
		}

	}

	/**
	 * Is logging enabled. This method will only return true on on debug like implementations.
	 * 
	 * @return boolean
	 */
	public boolean isLogEnabled() {
		return true;
	}

	/**
	 * Write a log message. This method is only implemented on debug like implementations.
	 * 
	 * @param msg
	 */
	public void log(Object msg) {
		println(";\n; " + msg + "\n;");
	}

	protected final int println(String msg) {
		final int rc = idx + buf.length();
		buf.append(msg);
		buf.append('\n');
		return rc;
	}

	private String disp(int v) {
		if (v > 0) {
			return "+" + v;
		} else if (v < 0) {
			return "" + v;
		} else {
			return "";
		}
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?