Add ret function

This commit is contained in:
2020-05-16 12:10:17 +02:00
parent 5d71a1316c
commit f9c43f19e6
6 changed files with 31 additions and 2 deletions

View File

@@ -89,6 +89,11 @@ seti %B $4;
int $3;
# Jump over the interrupt
call program_exit;
call noop_function;
int $3;
program_exit:
jmp the_real_exit;
noop_function:
ret;
the_real_exit:

View File

@@ -66,6 +66,11 @@ namespace Interpret
FunctionCallStatement(std::string const & label);
};
struct ReturnFromFunctionStatement : Statement
{
void Execute(Execute::Flags & flags, Execute::State & state, Execute::Registers & registers) override;
};
struct SetStatement : Statement
{
Value firstArgument;

View File

@@ -14,6 +14,7 @@ namespace Token
ShiftIntegerRight,
Jump,
CallFunction,
ReturnFromFunction,
LessThanInteger,
GreaterThanInteger,
EqualInteger,

View File

@@ -165,6 +165,11 @@ namespace Interpret
return std::make_unique<FunctionCallStatement>(std::get<std::string>(labelToken.data));
}
case Token::OperandType::ReturnFromFunction:
{
return std::make_unique<ReturnFromFunctionStatement>();
}
case Token::OperandType::LessThanInteger:
{
auto statement = std::make_unique<ControlFlowStatement>();
@@ -310,6 +315,7 @@ namespace Interpret
default:
std::printf("WARNING: returning default argument length of 0 for operand type %i\n", static_cast<int>(type));
case Token::OperandType::ReturnFromFunction:
return 0;
}
}

View File

@@ -66,6 +66,17 @@ namespace Interpret
{
}
void ReturnFromFunctionStatement::Execute(Execute::Flags & flags, Execute::State & state, Execute::Registers & registers)
{
if (state.stackPointer < sizeof(unsigned))
{
throw Execute::StackUnderflow();
}
state.nextStatement = *(reinterpret_cast<unsigned const *>(state.memory.data() + (state.stackPointer - 1u)));
state.stackPointer -= sizeof(unsigned);
}
void SetStatement::Execute(Execute::Flags & flags, Execute::State & state, Execute::Registers & registers)
{
firstArgument.GetValue(state, registers) = secondArgument.GetValue(state, registers);

View File

@@ -15,6 +15,7 @@ namespace Token
{ "shli", OperandType::ShiftIntegerLeft },
{ "jmp", OperandType::Jump },
{ "call", OperandType::CallFunction },
{ "ret", OperandType::ReturnFromFunction },
{ "lti", OperandType::LessThanInteger },
{ "gti", OperandType::GreaterThanInteger },
{ "eqi", OperandType::EqualInteger },