x86stream.java
来自「纯java操作系统jnode,安装简单和操作简单的个人使用的Java操作系统」· Java 代码 · 共 2,052 行 · 第 1/4 页
JAVA
2,052 行
* Create a ADD dstReg, [srcReg+srcDisp]
*
* @param dstReg
* @param srcReg
* @param srcDisp
*/
public final void writeADD(Register dstReg, Register srcReg, int srcDisp) {
writeModRM(0x03, srcReg.getNr(), srcDisp, dstReg.getNr());
}
/**
* Create a ADD [dstReg+dstDisp], imm32
*
* @param dstReg
* @param dstDisp
* @param imm32
*/
public void writeADD(Register dstReg, int dstDisp, int imm32) {
writeModRM(0x81, dstReg.getNr(), dstDisp, 0);
write32(imm32);
}
/**
* Create a ADC [dstReg+dstDisp], <srcReg>
*
* @param dstReg
* @param dstDisp
* @param srcReg
*/
public final void writeADC(Register dstReg, int dstDisp, Register srcReg) {
writeModRM(0x11, dstReg.getNr(), dstDisp, srcReg.getNr());
}
/**
* Create a ADC dstReg, srcReg
*
* @param dstReg
* @param srcReg
*/
public void writeADC(Register dstReg, Register srcReg) {
writeModRR(0x11, dstReg.getNr(), srcReg.getNr());
}
/**
* Create a AND reg, imm32
*
* @param reg
* @param imm32
*/
public final void writeAND(Register reg, int imm32) {
if (X86Utils.isByte(imm32)) {
writeModRR(0x83, reg.getNr(), 4);
write8(imm32);
} else {
writeModRR(0x81, reg.getNr(), 4);
write32(imm32);
}
}
/**
* Create a AND dstReg, srcReg
*
* @param dstReg
* @param srcReg
*/
public final void writeAND(Register dstReg, Register srcReg) {
writeModRR(0x21, dstReg.getNr(), srcReg.getNr());
}
/**
* Create a AND [dstReg+dstDisp], srcReg
*
* @param dstReg
* @param dstDisp
* @param srcReg
*/
public final void writeAND(Register dstReg, int dstDisp, Register srcReg) {
writeModRM(0x21, dstReg.getNr(), dstDisp, srcReg.getNr());
}
/**
* Create a bound lReg, [rReg+rDisp]
*
* @param lReg
* @param rReg
* @param rDisp
*/
public final void writeBOUND(Register lReg, Register rReg, int rDisp) {
writeModRM(0x62, rReg.getNr(), rDisp, lReg.getNr());
}
/**
* Create a relative call to a given label
*
* @param label
*/
public final void writeCALL(Label label) {
write8(0xe8); // call rel32
writeRelativeObjectRef(label);
}
/**
* Create a call to address stored at the given offset in the given table
* pointer.
*
* @param tablePtr
* @param offset
* @param rawAddress
* If true, tablePtr is a raw address
*/
public final void writeCALL(Object tablePtr, int offset, boolean rawAddress) {
write8(0xFF); // Opcode
write8(0x15); // effective address == disp32
writeObjectRef(tablePtr, offset, rawAddress);
}
/**
* Create a call to address stored at the given [reg+offset].
*
* @param reg
* @param offset
*/
public final void writeCALL(Register reg, int offset) {
writeModRM(0xFF, reg.getNr(), offset, 2);
}
/**
* Create a cdq
*/
public final void writeCDQ() {
write8(0x99);
}
/**
* Create a CMOVcc dst,src
*
* @param dst,src
*/
public void writeCMOVcc(int ccOpcode, Register dst, Register src) {
if (!haveCMOV) { throw new IllegalArgumentException(
"CMOVcc not support on current cpu"); }
write8(0x0F);
writeModRR(ccOpcode - 0x40, src.getNr(), dst.getNr());
}
/**
* Create a CMOVcc dst,[src+srcDisp]
*
* @param dst
* @param src
* @param srcDisp
*/
public void writeCMOVcc(int ccOpcode, Register dst, Register src,
int srcDisp) {
if (!haveCMOV) { throw new IllegalArgumentException(
"CMOVcc not support on current cpu"); }
write8(0x0F);
writeModRM(ccOpcode - 0x40, src.getNr(), srcDisp, dst.getNr());
}
/**
* Create a CMP EAX, imm32
*
* @param imm32
*/
public final void writeCMP_EAX(int imm32) {
write8(0x3d);
write32(imm32);
}
/**
* Create a CMP reg, imm32
*
* @param reg
* @param imm32
*/
public final void writeCMP(Register reg, int imm32) {
if (X86Utils.isByte(imm32)) {
writeModRR(0x83, reg.getNr(), 7);
write8(imm32);
} else {
writeModRR(0x81, reg.getNr(), 7);
write32(imm32);
}
}
/**
* Create a CMP [reg+regDisp], imm32
*
* @param memPtr
* @param imm32
*/
public final void writeCMP_MEM(int memPtr, int imm32) {
write8(0x81); // Opcode
write8(0x3D); // effective address == disp32
write32(memPtr);
write32(imm32);
}
/**
* Create a CMP reg,[memPtr]
*
* @param reg
* @param memPtr
*/
public void writeCMP_MEM(Register reg, int memPtr) {
write8(0x3b); // opcode
write8((reg.getNr() << 3) | 5); // disp32
write32(memPtr);
}
/**
* Create a CMP reg1, reg2
*
* @param reg1
* @param reg2
*/
public final void writeCMP(Register reg1, Register reg2) {
writeModRR(0x39, reg1.getNr(), reg2.getNr());
}
/**
* Create a CMP reg1, [reg2+disp]
*
* @param reg1
* @param reg2
* @param disp
*/
public void writeCMP(Register reg1, Register reg2, int disp) {
writeModRM(0x3b, reg2.getNr(), disp, reg1.getNr());
}
/**
* Create a CMP [reg1+disp], reg2
*
* @param reg1
* @param disp
* @param reg2
*/
public void writeCMP(Register reg1, int disp, Register reg2) {
writeModRM(0x39, reg1.getNr(), disp, reg2.getNr());
}
/**
* Create a CMPXCHG dword [dstReg], srcReg
*
* @param dstReg
* @param dstDisp
* @param srcReg
* @param lock
*/
public final void writeCMPXCHG_EAX(Register dstReg, int dstDisp,
Register srcReg, boolean lock) {
if (lock) {
write8(0xF0);
}
write8(0x0F);
writeModRM(0xB1, dstReg.getNr(), dstDisp, srcReg.getNr());
}
/**
* Create a dec reg32
*
* @param dstReg
*/
public final void writeDEC(Register dstReg) {
write8(0x48 + dstReg.getNr());
}
/**
* Create a dec dword [dstReg+dstDisp]
*
* @param dstReg
* @param dstDisp
*/
public final void writeDEC(Register dstReg, int dstDisp) {
writeModRM(0xff, dstReg.getNr(), dstDisp, 1);
}
/**
* Create a fadd dword [srcReg+srcDisp]
*
* @param srcReg
* @param srcDisp
*/
public final void writeFADD32(Register srcReg, int srcDisp) {
writeModRM(0xd8, srcReg.getNr(), srcDisp, 0);
}
/**
* Create a fadd qword [srcReg+srcDisp]
*
* @param srcReg
* @param srcDisp
*/
public final void writeFADD64(Register srcReg, int srcDisp) {
writeModRM(0xdc, srcReg.getNr(), srcDisp, 0);
}
/**
* Create a fchs
*/
public final void writeFCHS() {
write8(0xd9);
write8(0xe0);
}
/**
* Create a fdiv dword [srcReg+srcDisp]
*
* @param srcReg
* @param srcDisp
*/
public final void writeFDIV32(Register srcReg, int srcDisp) {
writeModRM(0xd8, srcReg.getNr(), srcDisp, 6);
}
/**
* Create a fdiv qword [srcReg+srcDisp]
*
* @param srcReg
* @param srcDisp
*/
public final void writeFDIV64(Register srcReg, int srcDisp) {
writeModRM(0xdc, srcReg.getNr(), srcDisp, 6);
}
/**
* Create a ffree
*
* @param fReg
*/
public final void writeFFREE(Register fReg) {
write8(0xdd);
write8(0xc0 | fReg.getNr());
}
/**
* Create a fild dword [dstReg+dstDisp]
*
* @param dstReg
* @param dstDisp
*/
public final void writeFILD32(Register dstReg, int dstDisp) {
writeModRM(0xdb, dstReg.getNr(), dstDisp, 0);
}
/**
* Create a fild qword [dstReg+dstDisp]
*
* @param dstReg
* @param dstDisp
*/
public final void writeFILD64(Register dstReg, int dstDisp) {
writeModRM(0xdf, dstReg.getNr(), dstDisp, 5);
}
/**
* Create a fistp dword [dstReg+dstDisp]
*
* @param dstReg
* @param dstDisp
*/
public final void writeFISTP32(Register dstReg, int dstDisp) {
writeModRM(0xdb, dstReg.getNr(), dstDisp, 3);
}
/**
* Create a fistp qword [dstReg+dstDisp]
*
* @param dstReg
* @param dstDisp
*/
public final void writeFISTP64(Register dstReg, int dstDisp) {
writeModRM(0xdf, dstReg.getNr(), dstDisp, 7);
}
/**
* Create a fld dword [srcReg+srcDisp]
*
* @param srcReg
* @param srcDisp
*/
public final void writeFLD32(Register srcReg, int srcDisp) {
writeModRM(0xd9, srcReg.getNr(), srcDisp, 0);
}
/**
* Create a fld qword [srcReg+srcDisp]
*
* @param srcReg
* @param srcDisp
*/
public final void writeFLD64(Register srcReg, int srcDisp) {
writeModRM(0xdd, srcReg.getNr(), srcDisp, 0);
}
/**
* Create a fmul dword [srcReg+srcDisp]
*
* @param srcReg
* @param srcDisp
*/
public final void writeFMUL32(Register srcReg, int srcDisp) {
writeModRM(0xd8, srcReg.getNr(), srcDisp, 1);
}
/**
* Create a fmul qword [srcReg+srcDisp]
*
* @param srcReg
* @param srcDisp
*/
public final void writeFMUL64(Register srcReg, int srcDisp) {
writeModRM(0xdc, srcReg.getNr(), srcDisp, 1);
}
/**
* Create a fnstsw, Store fp status word in AX
*/
public final void writeFNSTSW_AX() {
write8(0xdf);
write8(0xe0);
}
/**
* Create a fprem
*/
public final void writeFPREM() {
write8(0xd9);
write8(0xf8);
}
/**
* Create a fstp dword [dstReg+dstDisp]
*
* @param dstReg
* @param dstDisp
*/
public final void writeFSTP32(Register dstReg, int dstDisp) {
writeModRM(0xd9, dstReg.getNr(), dstDisp, 3);
}
/**
* Create a fstp qword [dstReg+dstDisp]
*
* @param dstReg
* @param dstDisp
*/
public final void writeFSTP64(Register dstReg, int dstDisp) {
writeModRM(0xdd, dstReg.getNr(), dstDisp, 3);
}
/**
* Create a fsub dword [srcReg+srcDisp]
*
* @param srcReg
* @param srcDisp
*/
public final void writeFSUB32(Register srcReg, int srcDisp) {
writeModRM(0xd8, srcReg.getNr(), srcDisp, 4);
}
/**
* Create a fsub qword [srcReg+srcDisp]
*
* @param srcReg
* @param srcDisp
*/
public final void writeFSUB64(Register srcReg, int srcDisp) {
writeModRM(0xdc, srcReg.getNr(), srcDisp, 4);
}
/**
* Create a fucompp, Compare - Pop twice
*/
public final void writeFUCOMPP() {
write8(0xda);
write8(0xe9);
}
/**
* Create a idiv eax, srcReg
*
* @param srcReg
*/
public final void writeIDIV_EAX(Register srcReg) {
writeModRR(0xF7, srcReg.getNr(), 7);
}
/**
* Create a imul eax, srcReg
*
* @param srcReg
*/
public final void writeIMUL_EAX(Register srcReg) {
writeModRR(0xF7, srcReg.getNr(), 5);
}
/**
* Create a inc reg32
*
* @param dstReg
*/
public final void writeINC(Register dstReg) {
write8(0x40 + dstReg.getNr());
}
/**
* Create a int vector
*
* @param vector
*/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?