mirror of
https://github.com/UberGames/ioef.git
synced 2025-01-18 23:21:37 +00:00
implement immediate argument for call
This commit is contained in:
parent
ed98f65d10
commit
b7eae0dca5
1 changed files with 21 additions and 11 deletions
|
@ -811,24 +811,34 @@ static void emit_call(const char* mnemonic, arg_t arg1, arg_t arg2, void* data)
|
||||||
{
|
{
|
||||||
u8 rex, modrm, sib;
|
u8 rex, modrm, sib;
|
||||||
|
|
||||||
if(arg1.type != T_REGISTER || arg2.type != T_NONE)
|
if((arg1.type != T_REGISTER && arg1.type != T_IMMEDIATE) || arg2.type != T_NONE)
|
||||||
CRAP_INVALID_ARGS;
|
CRAP_INVALID_ARGS;
|
||||||
|
|
||||||
if(!arg1.absolute)
|
if(arg1.type == T_REGISTER)
|
||||||
crap("call must be absolute");
|
{
|
||||||
|
if(!arg1.absolute)
|
||||||
|
crap("call must be absolute");
|
||||||
|
|
||||||
if((arg1.v.reg & R_64) != R_64)
|
if((arg1.v.reg & R_64) != R_64)
|
||||||
crap("register must be 64bit");
|
crap("register must be 64bit");
|
||||||
|
|
||||||
arg1.v.reg ^= R_64; // no rex required for call
|
arg1.v.reg ^= R_64; // no rex required for call
|
||||||
|
|
||||||
compute_rexmodrmsib(&rex, &modrm, &sib, &arg2, &arg1);
|
compute_rexmodrmsib(&rex, &modrm, &sib, &arg2, &arg1);
|
||||||
|
|
||||||
modrm |= 0x2 << 3;
|
modrm |= 0x2 << 3;
|
||||||
|
|
||||||
if(rex) emit1(rex);
|
if(rex) emit1(rex);
|
||||||
emit1(0xff);
|
emit1(0xff);
|
||||||
emit1(modrm);
|
emit1(modrm);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(!isu32(arg1.v.imm))
|
||||||
|
crap("must be 32bit argument");
|
||||||
|
emit1(0xe8);
|
||||||
|
emit4(arg1.v.imm);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue