예제 #1
0
        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);
        }
예제 #2
0
        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);
            }
        }
예제 #3
0
 public void MovRegisterToRegister(AssemRegisters src, AssemRegisters dst)
 {
     if (src != dst)
     {
         LinesAdd($"mov {RegisterName(dst)}, {RegisterName(src)}");
     }
 }
예제 #4
0
 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}]");
     }
 }
예제 #5
0
 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}]");
     }
 }
예제 #6
0
 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}");
     }
 }
예제 #7
0
 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}]");
     }
 }
예제 #8
0
 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}");
     }
 }
예제 #9
0
 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}]");
     }
 }
예제 #10
0
 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}]");
     }
 }
예제 #11
0
 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)}");
     }
 }
예제 #12
0
 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)}");
     }
 }
예제 #13
0
 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)}");
     }
 }
예제 #14
0
        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);
                }
            }
        }
예제 #15
0
        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)}");
            }
        }
예제 #16
0
        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);
                }
            }
        }
예제 #17
0
        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);
        }
예제 #18
0
        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.");
            }
        }
예제 #19
0
        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);
            }
        }
예제 #20
0
        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);
            }
        }
예제 #21
0
        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);
            }
        }
예제 #22
0
 public void ShiftRight(AssemRegisters reg, AssemRegisters amt_reg, AssemRegisters dst_reg)
 {
     ShiftGeneric(reg, amt_reg, dst_reg, true, true);
 }
예제 #23
0
 public void XorConst(ulong src, AssemRegisters dst, AssemRegisters dst0)
 {
     LinesAdd($"xor {RegisterName(dst)}, 0x{src:X}");
     MovRegisterToRegister(dst, dst0);
 }
예제 #24
0
 public void Xor(AssemRegisters src, AssemRegisters dst, AssemRegisters dst0)
 {
     LinesAdd($"xor {RegisterName(dst)}, {RegisterName(src)}");
     MovRegisterToRegister(dst, dst0);
 }
예제 #25
0
 public void Not(AssemRegisters src, AssemRegisters dst0)
 {
     LinesAdd($"not {RegisterName(src)}");
     MovRegisterToRegister(src, dst0);
 }
예제 #26
0
 public void Compare(AssemRegisters v1, AssemRegisters v2)
 {
     LinesAdd($"cmp {RegisterName(v1)}, {RegisterName(v2)}");
 }
예제 #27
0
 public void Pop(AssemRegisters reg)
 {
     LinesAdd($"pop {RegisterName(reg)}");
 }
예제 #28
0
 public void Push(AssemRegisters reg)
 {
     LinesAdd($"push {RegisterName(reg)}");
 }
예제 #29
0
 public void ShiftLeft(AssemRegisters reg, int amt_reg, AssemRegisters dst_reg)
 {
     ShiftGeneric(reg, amt_reg, dst_reg, false, true);
 }
예제 #30
0
 public void ShiftRightUn(AssemRegisters reg, int amt_reg, AssemRegisters dst_reg)
 {
     ShiftGeneric(reg, amt_reg, dst_reg, true, false);
 }