mirror of
https://gitlab.os-k.eu/os-k-team/kvisc.git
synced 2023-08-25 14:05:46 +02:00
stack and function calls
This commit is contained in:
parent
7031207afb
commit
fe465ec81d
@ -50,6 +50,12 @@ push r
|
||||
|
||||
pop r
|
||||
|
||||
call r
|
||||
call i
|
||||
call m
|
||||
|
||||
ret
|
||||
|
||||
cli
|
||||
sti
|
||||
|
||||
|
@ -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();
|
||||
|
@ -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");
|
||||
}
|
||||
|
||||
|
@ -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,
|
||||
|
Loading…
x
Reference in New Issue
Block a user