From c32251b5a03f8d82bc8d67f0c066ef064782ac7a Mon Sep 17 00:00:00 2001 From: sfja Date: Wed, 2 Apr 2025 16:13:31 +0200 Subject: [PATCH] add push pop --- asm/main.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++-- kern/main.asm | 52 +++++++++++++-------------------------------------- 2 files changed, 60 insertions(+), 41 deletions(-) diff --git a/asm/main.c b/asm/main.c index 6e0d987..0c305c8 100644 --- a/asm/main.c +++ b/asm/main.c @@ -488,6 +488,14 @@ void pline_free(PLine* pline) free(pline); } +typedef enum { + PStmtTy_Line, + PStmtTy_Global, + PStmtTy_Extern, + PStmtTy_Include, + PStmtTy_Define, +} PStmtTy; + typedef struct { Lexer lexer; Tok tok; @@ -1362,7 +1370,7 @@ typedef enum { M_iret, M_or, M_xor, M_and, M_shl, M_rshl, M_shr, M_rshr, M_add, M_sub, M_rsub, M_mul, M_imul, M_div, M_idiv, M_rdiv, M_ridiv, M_mod, - M_rmod, + M_rmod, M_push, M_pop // clang-format on } Mnemonic; @@ -1374,7 +1382,7 @@ const char* mnemonic_str[] = { "iret", "or", "xor", "and", "shl", "rshl", "shr", "rshr", "add", "sub", "rsub", "mul", "imul", "div", "idiv", "rdiv", "ridiv", "mod", - "rmod", + "rmod", "push", "pop" // clang-format on }; @@ -1985,7 +1993,44 @@ static inline uint16_t pline_assemble(OperandEvaluator* evaluator, } } break; + case M_push: + if (line->ops_size == 1) { + EvaledOperand op1 = eval_operand(evaluator, line->ops[0]); + CHECK_OPERAND(op1); + if (op1.ty == EoTy_Reg) { + uint16_t size = 0; + Line l; + l = s_add_i(Rsp, Rsp, 2); + size += assemble_line(object, &l); + l = s_mov16_mr_r(Rsp, 0, op1.reg); + size += assemble_line(object, &l); + return size; + } + if (op1.ty == EoTy_Imm) { + uint16_t size = 0; + Line l; + l = s_add_i(Rsp, Rsp, 2); + size += assemble_line(object, &l); + l = s_mov16_mr_i(Rsp, 0, op1.imm); + size += assemble_line(object, &l); + return size; + } + } break; + case M_pop: + if (line->ops_size == 1) { + EvaledOperand op1 = eval_operand(evaluator, line->ops[0]); + CHECK_OPERAND(op1); + if (op1.ty == EoTy_Reg) { + uint16_t size = 0; + Line l; + l = s_mov16_r_mr(op1.reg, Rsp, 0); + size += assemble_line(object, &l); + l = s_sub_i(Rsp, Rsp, 2); + size += assemble_line(object, &l); + return size; + } + } break; } reporter_error_with_loc(rep, "malformed instruction", line->loc); diff --git a/kern/main.asm b/kern/main.asm index bd02b8e..311d4e9 100644 --- a/kern/main.asm +++ b/kern/main.asm @@ -25,22 +25,12 @@ interrupt_table: keyboard_interrupt: and rfl, rfl, !(1 << 5) ; Fl_Int - ; push rbp - add rsp, rsp, 2 - mov u16 [rsp], rbp + push rbp mov rbp, rsp - ; push r0 - add rsp, rsp, 2 - mov u16 [rsp], r0 - ; push r1 - add rsp, rsp, 2 - mov u16 [rsp], r1 - ; push r2 - add rsp, rsp, 2 - mov u16 [rsp], r2 - ; push r3 - add rsp, rsp, 2 - mov u16 [rsp], r3 + push r0 + push r1 + push r2 + push r3 in r0, 0 ; Device_Keyboard @@ -96,22 +86,12 @@ keyboard_interrupt: .L4: - ; pop r3 - mov r3, u16 [rsp] - sub rsp, rsp, 2 - ; pop r2 - mov r2, u16 [rsp] - sub rsp, rsp, 2 - ; pop r1 - mov r1, u16 [rsp] - sub rsp, rsp, 2 - ; pop r0 - mov r0, u16 [rsp] - sub rsp, rsp, 2 + pop r3 + pop r2 + pop r1 + pop r0 mov rsp, rbp - ; pop rbp - mov rbp, u16 [rsp] - sub rsp, rsp, 2 + pop rbp or rfl, rfl, 1 << 5 ; Fl_Int iret @@ -152,16 +132,10 @@ put_char: mov u16 [screen_x], r1 .L1: - ; pop r1 - mov r1, u16 [rsp] - sub rsp, rsp, 2 - ; pop r2 - mov r2, u16 [rsp] - sub rsp, rsp, 2 + pop r1 + pop r2 mov rsp, rbp - ; pop rbp - mov rbp, u16 [rsp] - sub rsp, rsp, 2 + pop rbp ret screen_x: