⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 x86s_common.cpp

📁 当前支持 16-bit, 32-bit and 64-bit 的二进制文件
💻 CPP
字号:
// x86s_common.cpp
// Copyright (C) 2008 Willow Schlanger

#include "types.h"
#include "x86s_common.h"

namespace x86s
{

U1 get_argtype_lo(U1 x)
{
	return x & ARGTYPE_LO_MASK;
}

U1 get_argtype_hi(U1 x)
{
	return x >> ARGTYPE_HI_SHIFT;
}

U1 get_argsize_lo(U1 x)
{
	return x & ARGSIZE_LO_MASK;
}

UINT get_argsize_bytes(U1 x)
{
	U1 lo = get_argsize_lo(x);
	U1 hi = get_argsize_hi(x);
	UINT sz = 0;
	
	switch(lo)
	{
		case argsize_16:
			sz = 2;
			break;
		case argsize_32:
			sz = 4;
			break;
		case argsize_64:
			sz = 8;
			break;
		case argsize_8:
			sz = 1;
			break;
		case argsize_128:
			sz = 16;
			break;
		case argsize_24:
			sz = 4;
			break;
		case argsize_512b:
			sz = 512;
			break;
		default:
			return 0;	// unknown
	}
	
	switch(hi)
	{
		case argsize__end:	// no hi size
			break;
		case argsize_16:
			sz += 2;
			break;
		case argsize_32:
			sz += 4;
			break;
		case argsize_64:
			sz += 8;
			break;
		case argsize_8:		// not used
			sz += 1;
			break;
		case argsize_128:	// not used
			sz += 16;
			break;
		case argsize_24:
			sz += 4;
			break;
		case argsize_512b:	// not used
			sz += 512;
			break;
		default:
			return 0;
	}
	
	return sz;
}

// This returns argsize__end if the size is unrecognized or if there is no hi-size.
U1 get_argsize_hi(U1 x)
{
	switch(x >> ARGSIZE_HI_SHIFT)
	{
		case argsize_hi_none:
			return argsize__end;
		case argsize_hi_16:
			return argsize_16;
		case argsize_hi_32:
			return argsize_32;
		case argsize_hi_64:
			return argsize_64;
		case argsize_hi_24:
			return argsize_24;
		case argsize_hi_osz:
			return argsize_osz;
		case argsize_hi_osz_24:
			return argsize_osz_24;
		case argsize_hi_osz_old:
			return argsize_osz_old;
		default:
			break;
	}
	return argsize__end;
}

U1 specialize_arg_size(U1 argsize, U4 dsz, U4 osz, U4 asz)
{
	U1 lo = get_argsize_lo(argsize);
	U1 hi = argsize >> ARGSIZE_HI_SHIFT;
	
	switch(lo)
	{
		case argsize_osz_new:		// 64 bits, or 128 if rex.w is used (used by _cmpxchgxb)
			lo = (osz == argsize_64) ? argsize_128 : argsize_64;
			break;
		case argsize_osz_32:		// size is osz unless osz = 16, then use 32 bits (movsx, movzx)
			lo = (osz == argsize_16) ? argsize_32 : osz;
			break;
		case argsize_osz_ptr:		// 64 bits in long mode (default osz = 64), else 32 bits (vmread, vmwrite)
			lo = (dsz == argsize_64) ? argsize_64 : argsize_32;
			break;
		case argsize_osz:
			lo = osz;
			break;
		case argsize_osz_old:		// osz, but never 64 bits (16 or 32 bits)
			lo = (osz == argsize_64) ? argsize_32 : osz;
			break;
		case argsize_osz_24:		// 64 bits if in long mode. else: ->24 if o16, ->32 if o32
			if(dsz == argsize_64)
				lo = argsize_64;
			else
				lo = (osz == argsize_16) ? argsize_hi_24 : argsize_hi_32;
			break;
		case argsize_asz:			// used for loop,loopz,loopnz,jrcxz
			lo = asz;
			break;
		default:
			break;
	}
	
	switch(hi)
	{
		case argsize_hi_osz:
			hi = osz;
			break;
		case argsize_hi_osz_24:
			if(dsz == argsize_64)
				hi = argsize_64;
			else
				hi = (osz == argsize_16) ? argsize_hi_24 : argsize_hi_32;
			break;
		case argsize_hi_osz_old:
			hi = (osz == argsize_64) ? argsize_32 : osz;
			break;
		default:
			break;
	}
	
	return ARGSIZE(lo, hi);
}

bool arg_is_osz_sensitive(U1 argsize)
{
	U1 lo = get_argsize_lo(argsize);
	U1 hi = argsize >> ARGSIZE_HI_SHIFT;
	
	switch(lo)
	{
		case argsize_osz_new:		// 64 bits, or 128 if rex.w is used (used by _cmpxchgxb)
		case argsize_osz_32:		// size is osz unless osz = 16, then use 32 bits (movsx, movzx)
		case argsize_osz_ptr:		// 64 bits in long mode (default osz = 64), else 32 bits (vmread, vmwrite)
		case argsize_osz:
		case argsize_osz_old:		// osz, but never 64 bits (16 or 32 bits)
		case argsize_osz_24:		// 64 bits if in long mode. else: ->24 if o16, ->32 if o32
		case argsize_asz:			// used for loop,loopz,loopnz,jrcxz
			return true;
		default:
			break;
	}
	switch(hi)
	{
		case argsize_hi_osz:
		case argsize_hi_osz_24:
		case argsize_hi_osz_old:
			return true;
		default:
			break;
	}
	return false;
}

}	// namespace x86s

⌨️ 快捷键说明

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