stack and function calls

This commit is contained in:
julianb0 2019-05-16 17:11:22 +02:00
parent 7031207afb
commit fe465ec81d
No known key found for this signature in database
GPG Key ID: DDF8325C95299A62
4 changed files with 47 additions and 4 deletions

View File

@ -50,6 +50,12 @@ push r
pop r
call r
call i
call m
ret
cli
sti

View File

@ -93,7 +93,7 @@ IMPL_START_1(push)
_except(ctx, E_STK, "RSP above RBP");
}
writemem64(ctx, v1, ctx->r[RSP]);
writemem64(ctx, v1, ctx->r[RSP].val);
ctx->r[RSP].val -= 8;
}
IMPL_END;
@ -107,12 +107,43 @@ IMPL_START_1(pop)
if (ctx->r[RSP].val >= ctx->r[RBP].val) {
_except(ctx, E_STK, "RBP above RSP");
}
v1 = readmem64(ctx, ctx->r[RSP]);
ctx->r[RSP].val += 8;
v1 = readmem64(ctx, ctx->r[RSP].val);
}
IMPL_OUT;
IMPL_START_1(call)
{
if (ctx->r[RSP].val % 8 > 0 || ctx->r[RBP].val % 8 > 0) {
_except(ctx, E_STK, "Misaligned stack REGS");
}
if (ctx->r[RSP].val > ctx->r[RBP].val) {
_except(ctx, E_STK, "RSP above RBP");
}
writemem64(ctx, ctx->r[RIP].val, ctx->r[RSP].val);
ctx->r[RSP].val -= 8;
ctx->r[RIP].val = v1;
}
IMPL_END;
IMPL_START_0(ret)
{
if (ctx->r[RSP].val % 8 > 0 || ctx->r[RBP].val % 8 > 0) {
_except(ctx, E_STK, "Misaligned stack REGS");
}
if (ctx->r[RSP].val >= ctx->r[RBP].val) {
_except(ctx, E_STK, "RBP above RSP");
}
ctx->r[RSP].val += 8;
ctx->r[RIP].val = readmem64(ctx, ctx->r[RSP].val);
}
IMPL_END;
IMPL_START_0(cli)
{
CHK_SUPERV();

View File

@ -64,6 +64,7 @@ void decode(ctx_t *ctx)
ushort c = ctx->get(ctx);
if (c == 0xFFFF) {
log("0x%016lX: stop\n", rip);
_except(ctx, E_SHT, "Shutdown INSTR");
}

View File

@ -8,7 +8,12 @@ ushort fwprog[] = {
I_MOV_R_I, RBP, A_IMM32, FWSTACK>>16, FWSTACK&0xFF,
I_MOV_R_I, RSP, A_IMM32, FWSTACK>>16, FWSTACK&0xFF,
I_PUSH_I, A_IMM16, 0xDDEE,
I_CALL_I, A_IMM32, (MEMOFF+0x13)>>16, (MEMOFF+0x13)&0xFF,
I_ADD_R_I, RAX, A_IMM16, 1,
0xFFFF,
I_ADD_R_I, RBX, A_IMM16, 1,
I_RET,
/*
I_MOV_M_I, A_MEM, RBP, A_IMM16, 0xAC,