private void ShiftGeneric(AssemRegisters reg, int amt_reg, AssemRegisters dst_reg, bool right, bool signed) { string inst = ""; if (signed) { if (right) { inst = "sar"; } else { inst = "sal"; } } else { if (right) { inst = "shr"; } else { inst = "shl"; } } LinesAdd($"{inst} {RegisterName(reg)}, {amt_reg}"); MovRegisterToRegister(reg, dst_reg); }
public void MovRegisterToRegisterSignSize(AssemRegisters src, int src_size, AssemRegisters dst, int dst_size, bool signed) { if (src_size > dst_size) { src_size = dst_size; } if (src_size != dst_size) { if (signed) { LinesAdd($"movsx {RegisterName(dst, dst_size)}, {RegisterName(src, src_size)}"); } else { if (dst_size == 8 && src_size == 4) { MovConstantToRegister(0, dst); MovRegisterToRegisterSize(src, src_size, dst, src_size); } else { LinesAdd($"movzx {RegisterName(dst, dst_size)}, {RegisterName(src, src_size)}"); } } } else if (src != dst) { MovRegisterToRegisterSize(src, src_size, dst, dst_size); } }
public void MovRegisterToRegister(AssemRegisters src, AssemRegisters dst) { if (src != dst) { LinesAdd($"mov {RegisterName(dst)}, {RegisterName(src)}"); } }
public void LoadEffectiveMultAddress(AssemRegisters src_reg, AssemRegisters srcRegMult, int multiplier, int offset, AssemRegisters dst_reg) { if (offset >= 0) { LinesAdd($"lea {RegisterName(dst_reg)}, [{RegisterName(src_reg)} + {RegisterName(srcRegMult)} * {multiplier} + {offset}]"); } else { LinesAdd($"lea {RegisterName(dst_reg)}, [{RegisterName(src_reg)} + {RegisterName(srcRegMult)} * {multiplier}- {-offset}]"); } }
public void LoadEffectiveAddress(AssemRegisters src_reg, int offset, AssemRegisters dst_reg) { if (offset >= 0) { LinesAdd($"lea {RegisterName(dst_reg)}, [{RegisterName(src_reg)} + {offset}]"); } else { LinesAdd($"lea {RegisterName(dst_reg)}, [{RegisterName(src_reg)} - {-offset}]"); } }
public void MovLabelRelativeConstantToRegisterSize(string lbl, int off, AssemRegisters dstReg, int dst_sz) { if (off >= 0) { LinesAdd($"mov {RegisterName(dstReg, dst_sz)}, {lbl} + {off}"); } else { LinesAdd($"mov {RegisterName(dstReg, dst_sz)}, {lbl} - {-off}"); } }
public void MovRelativeAddressMultToRegisterSize(AssemRegisters srcReg, AssemRegisters srcRegMult, int multiplier, int offset, AssemRegisters dstReg, int dst_sz) { if (offset >= 0) { LinesAdd($"mov {RegisterName(dstReg, dst_sz)}, [{RegisterName(srcReg)} + {multiplier} * {RegisterName(srcRegMult)} + {offset}]"); } else { LinesAdd($"mov {RegisterName(dstReg, dst_sz)}, [{RegisterName(srcReg)} + {multiplier} * {RegisterName(srcRegMult)} - {-offset}]"); } }
public void MovConstantToRegisterSize(ulong val, AssemRegisters dstReg, int dst_sz) { if (val == 0) { LinesAdd($"xor {RegisterName(dstReg, 4)}, {RegisterName(dstReg, 4)}"); } else { LinesAdd($"mov {RegisterName(dstReg, dst_sz)}, 0x{val:X}"); } }
public void MovRelativeAddressToRegister(AssemRegisters srcReg, int offset, AssemRegisters dstReg) { if (offset >= 0) { LinesAdd($"mov {RegisterName(dstReg)}, [{RegisterName(srcReg)} + {offset}]"); } else { LinesAdd($"mov {RegisterName(dstReg)}, [{RegisterName(srcReg)} - {-offset}]"); } }
public void MovLabelRelativeAddressToRegisterSize(string lbl, int offset, AssemRegisters dstReg, int dstSz) { if (offset >= 0) { LinesAdd($"mov {RegisterName(dstReg, dstSz)}, [rel {lbl} + {offset}]"); } else { LinesAdd($"mov {RegisterName(dstReg, dstSz)}, [rel {lbl} - {-offset}]"); } }
public void MovRegisterToLabelRelativeAddressSize(AssemRegisters srcReg, int src_sz, string lbl, int offset) { if (offset >= 0) { LinesAdd($"mov [rel {lbl} + {offset}], {RegisterName(srcReg, src_sz)}"); } else { LinesAdd($"mov [rel {lbl} - {-offset}], {RegisterName(srcReg, src_sz)}"); } }
public void MovRegisterToRegisterRelativeAddressMultSize(AssemRegisters srcReg, int src_sz, AssemRegisters dstReg, AssemRegisters dstMultReg, int multiplier, int offset) { if (offset >= 0) { LinesAdd($"mov [{RegisterName(dstReg)} + {RegisterName(dstMultReg)} * {multiplier} + {offset}], {RegisterName(srcReg, src_sz)}"); } else { LinesAdd($"mov [{RegisterName(dstReg)} + {RegisterName(dstMultReg)} * {multiplier} - {-offset}], {RegisterName(srcReg, src_sz)}"); } }
public void MovRegisterToRegisterRelativeAddress(AssemRegisters srcReg, AssemRegisters dstReg, int offset) { if (offset >= 0) { LinesAdd($"mov [{RegisterName(dstReg)} + {offset}], {RegisterName(srcReg)}"); } else { LinesAdd($"mov [{RegisterName(dstReg)} - {-offset}], {RegisterName(srcReg)}"); } }
public void In(AssemRegisters srcReg, AssemRegisters dstReg, int size) { if (srcReg == AssemRegisters.Rax && dstReg == AssemRegisters.Rdx) { LinesAdd($"xchg rax, rdx"); } else { if (srcReg == AssemRegisters.Rax) { Push(AssemRegisters.Rdx); MovRegisterToRegisterSize(srcReg, 2, AssemRegisters.Rdx, 2); } if (dstReg != AssemRegisters.Rax) { Push(AssemRegisters.Rax); MovRegisterToRegisterSize(dstReg, size, AssemRegisters.Rax, size); } if (srcReg != AssemRegisters.Rdx && srcReg != AssemRegisters.Rax) { Push(AssemRegisters.Rdx); MovRegisterToRegisterSize(srcReg, 2, AssemRegisters.Rdx, 2); } } LinesAdd($"in {RegisterName(AssemRegisters.Rax, size)}, {RegisterName(AssemRegisters.Rdx, 2)}"); //TODO review and fix following bit of code if (srcReg == AssemRegisters.Rax && dstReg == AssemRegisters.Rdx) { LinesAdd($"xchg rax, rdx"); } else { if (srcReg != AssemRegisters.Rdx && srcReg == AssemRegisters.Rax) { Pop(AssemRegisters.Rdx); } if (dstReg != AssemRegisters.Rax) { Pop(AssemRegisters.Rax); } if (srcReg != AssemRegisters.Rdx && srcReg != AssemRegisters.Rax) { Pop(AssemRegisters.Rdx); } } }
public void MovRegisterToRegisterSize(AssemRegisters src, int src_size, AssemRegisters dst, int dst_size) { if (src_size > dst_size) { src_size = dst_size; } if (src != dst | src_size != dst_size) { LinesAdd($"mov {RegisterName(dst, dst_size)}, {RegisterName(src, src_size)}"); } }
public void Out(AssemRegisters srcReg, AssemRegisters src2Reg, int size) { if (srcReg == AssemRegisters.Rax && src2Reg == AssemRegisters.Rdx) { LinesAdd($"xchg rax, rdx"); } else { if (srcReg == AssemRegisters.Rax) { Push(AssemRegisters.Rdx); MovRegisterToRegisterSize(srcReg, 2, AssemRegisters.Rdx, 2); } if (src2Reg != AssemRegisters.Rax) { Push(AssemRegisters.Rax); MovRegisterToRegisterSize(src2Reg, size, AssemRegisters.Rax, size); } if (srcReg != AssemRegisters.Rdx && srcReg != AssemRegisters.Rax) { Push(AssemRegisters.Rdx); MovRegisterToRegisterSize(srcReg, 2, AssemRegisters.Rdx, 2); } } LinesAdd($"out {RegisterName(AssemRegisters.Rdx, 2)}, {RegisterName(AssemRegisters.Rax, size)}"); if (srcReg == AssemRegisters.Rax && src2Reg == AssemRegisters.Rdx) { LinesAdd($"xchg rax, rdx"); } else { if (srcReg != AssemRegisters.Rdx && srcReg == AssemRegisters.Rax) { Pop(AssemRegisters.Rdx); } if (src2Reg != AssemRegisters.Rax) { Pop(AssemRegisters.Rax); } if (srcReg != AssemRegisters.Rdx && srcReg != AssemRegisters.Rax) { Pop(AssemRegisters.Rdx); } } }
public void AddConst(ulong src, AssemRegisters dst, AssemRegisters dst0) { if (src == 1) { LinesAdd($"inc {RegisterName(dst)}"); } else { LinesAdd($"add {RegisterName(dst)}, 0x{src:X}"); } MovRegisterToRegister(dst, dst0); }
public void URemainder(AssemRegisters src, AssemRegisters divisor, AssemRegisters dst) { if (src != AssemRegisters.Rax) { throw new Exception("Rax expected."); } MovConstantToRegister(0, AssemRegisters.Rdx); LinesAdd($"div {RegisterName(divisor)}"); if (dst != AssemRegisters.Rdx) { throw new Exception("Rdx expected."); } }
public void OutConst(byte src_addr, AssemRegisters srcReg, int size) { if (srcReg != AssemRegisters.Rax) { Push(AssemRegisters.Rax); MovRegisterToRegisterSize(srcReg, size, AssemRegisters.Rax, size); } LinesAdd($"out 0x{src_addr:X}, {RegisterName(AssemRegisters.Rax, size)}"); if (srcReg != AssemRegisters.Rax) { Pop(AssemRegisters.Rax); } }
public void InConst(int src_addr, AssemRegisters dstReg, int size) { if (dstReg != AssemRegisters.Rax) { Push(AssemRegisters.Rax); MovRegisterToRegisterSize(dstReg, size, AssemRegisters.Rax, size); } LinesAdd($"in {RegisterName(AssemRegisters.Rax, size)}, 0x{src_addr:X}"); MovRegisterToRegisterSize(AssemRegisters.Rax, size, dstReg, size); if (dstReg != AssemRegisters.Rax) { Pop(AssemRegisters.Rax); } }
private void ShiftGeneric(AssemRegisters reg, AssemRegisters amt_reg, AssemRegisters dst_reg, bool right, bool signed) { if (amt_reg != AssemRegisters.Rcx) { Push(AssemRegisters.Rcx); MovRegisterToRegister(amt_reg, AssemRegisters.Rcx); } string inst = ""; if (signed) { if (right) { inst = "sar"; } else { inst = "sal"; } } else { if (right) { inst = "shr"; } else { inst = "shl"; } } LinesAdd($"{inst} {RegisterName(reg)}, cl"); MovRegisterToRegister(reg, dst_reg); if (amt_reg != AssemRegisters.Rcx) { Pop(AssemRegisters.Rcx); } }
public void ShiftRight(AssemRegisters reg, AssemRegisters amt_reg, AssemRegisters dst_reg) { ShiftGeneric(reg, amt_reg, dst_reg, true, true); }
public void XorConst(ulong src, AssemRegisters dst, AssemRegisters dst0) { LinesAdd($"xor {RegisterName(dst)}, 0x{src:X}"); MovRegisterToRegister(dst, dst0); }
public void Xor(AssemRegisters src, AssemRegisters dst, AssemRegisters dst0) { LinesAdd($"xor {RegisterName(dst)}, {RegisterName(src)}"); MovRegisterToRegister(dst, dst0); }
public void Not(AssemRegisters src, AssemRegisters dst0) { LinesAdd($"not {RegisterName(src)}"); MovRegisterToRegister(src, dst0); }
public void Compare(AssemRegisters v1, AssemRegisters v2) { LinesAdd($"cmp {RegisterName(v1)}, {RegisterName(v2)}"); }
public void Pop(AssemRegisters reg) { LinesAdd($"pop {RegisterName(reg)}"); }
public void Push(AssemRegisters reg) { LinesAdd($"push {RegisterName(reg)}"); }
public void ShiftLeft(AssemRegisters reg, int amt_reg, AssemRegisters dst_reg) { ShiftGeneric(reg, amt_reg, dst_reg, false, true); }
public void ShiftRightUn(AssemRegisters reg, int amt_reg, AssemRegisters dst_reg) { ShiftGeneric(reg, amt_reg, dst_reg, true, false); }