From d29293b84c17499dd591a07652421aff0ceb9429 Mon Sep 17 00:00:00 2001 From: sfja Date: Mon, 31 Mar 2025 22:02:35 +0200 Subject: [PATCH] all jmp, jnz, cmp --- asm/asm.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++ asm/asm.h | 12 +++++++++++ asm/ctors.c | 46 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 119 insertions(+), 1 deletion(-) diff --git a/asm/asm.c b/asm/asm.c index ce18298..66a7468 100644 --- a/asm/asm.c +++ b/asm/asm.c @@ -81,6 +81,23 @@ uint16_t assemble_to_binary(uint16_t* out, const Line* lines, size_t lines_size) out[ip++] = Op_Hlt; break; } + case LineTy_Jmp_Reg: { + uint16_t op1 = line->op1.reg; + + uint32_t ins = Op_Jmp; + add_op1_reg(&ins, op1); + out[ip++] = (uint16_t)ins; + break; + } + case LineTy_Jmp_Imm: { + uint16_t op1 = line->op1.imm; + + uint32_t ins = Op_Jmp; + set_is_imm(&ins); + out[ip++] = (uint16_t)ins; + out[ip++] = op1; + break; + } case LineTy_Jmp_Label: { int op1 = line->op1.label; @@ -90,6 +107,29 @@ uint16_t assemble_to_binary(uint16_t* out, const Line* lines, size_t lines_size) ADD_LABEL(op1); break; } + case LineTy_Jnz_Reg: { + uint16_t op1 = line->op1.reg; + uint16_t op2 = line->op2.reg; + + uint32_t ins = Op_Jnz; + add_op1_reg(&ins, op1); + add_op2_reg(&ins, op2); + + out[ip++] = (uint16_t)ins; + break; + } + case LineTy_Jnz_Imm: { + uint16_t op1 = line->op1.reg; + uint16_t op2 = line->op2.imm; + + uint32_t ins = Op_Jnz; + set_is_imm(&ins); + add_op1_reg(&ins, op1); + + out[ip++] = (uint16_t)ins; + out[ip++] = op2; + break; + } case LineTy_Jnz_Label: { uint16_t op1 = line->op1.reg; int op2 = line->op2.label; @@ -102,6 +142,17 @@ uint16_t assemble_to_binary(uint16_t* out, const Line* lines, size_t lines_size) ADD_LABEL(op2); break; } + case LineTy_Cmp_Reg: { + uint16_t op1 = line->op1.reg; + uint16_t op2 = line->op2.reg; + + uint32_t ins = Op_Cmp; + add_op1_reg(&ins, op1); + add_op2_reg(&ins, op2); + + out[ip++] = (uint16_t)ins; + break; + } case LineTy_Cmp_Imm: { uint16_t op1 = line->op1.reg; uint16_t op2 = line->op2.imm; @@ -113,6 +164,17 @@ uint16_t assemble_to_binary(uint16_t* out, const Line* lines, size_t lines_size) out[ip++] = (uint16_t)ins; out[ip++] = op2; break; + } + case LineTy_Cmp_Label: { + uint16_t op1 = line->op1.reg; + int op2 = line->op2.label; + + uint32_t ins = Op_Cmp; + set_is_imm(&ins); + add_op1_reg(&ins, op1); + + out[ip++] = (uint16_t)ins; + ADD_LABEL(op2); break; } case LineTy_Mov8_MemReg_Reg: { diff --git a/asm/asm.h b/asm/asm.h index e97462f..2f66bd4 100644 --- a/asm/asm.h +++ b/asm/asm.h @@ -10,9 +10,15 @@ typedef enum { LineTy_DataLabel, LineTy_Nop, LineTy_Hlt, + LineTy_Jmp_Reg, + LineTy_Jmp_Imm, LineTy_Jmp_Label, + LineTy_Jnz_Reg, + LineTy_Jnz_Imm, LineTy_Jnz_Label, + LineTy_Cmp_Reg, LineTy_Cmp_Imm, + LineTy_Cmp_Label, LineTy_Mov8_MemReg_Reg, LineTy_Mov8_MemImm_Imm, LineTy_Mov8_MemImm_Reg, @@ -92,9 +98,15 @@ Line s_data_i(uint16_t data); Line s_data_l(int label); Line s_nop(void); Line s_hlt(void); +Line s_jmp_r(Reg op1_reg); +Line s_jmp_i(uint16_t op1_imm); Line s_jmp_l(int op1_label); +Line s_jnz_r(Reg op1_reg, Reg op2_reg); +Line s_jnz_i(Reg op1_reg, uint16_t op2_imm); Line s_jnz_l(Reg op1_reg, int op2_label); +Line s_cmp_r(Reg op1_reg, Reg op2_reg); Line s_cmp_i(Reg op1_reg, uint16_t op2_imm); +Line s_cmp_l(Reg op1_reg, int op2_label); Line s_mov8_mr_r(Reg dst_reg, Reg op2_reg); Line s_mov8_mi_i(uint16_t dst_imm, uint16_t op2_imm); Line s_mov8_mi_r(uint16_t dst_imm, Reg op2_reg); diff --git a/asm/ctors.c b/asm/ctors.c index efef9db..b6ac8d6 100644 --- a/asm/ctors.c +++ b/asm/ctors.c @@ -1,4 +1,5 @@ #include "asm.h" +#include "common/arch.h" #include Line s_label(int label) @@ -31,6 +32,20 @@ Line s_hlt(void) { return (Line) { .ty = LineTy_Hlt }; } +Line s_jmp_r(Reg op1_reg) +{ + return (Line) { + .ty = LineTy_Jmp_Reg, + .op1 = (Ex) { .reg = (uint16_t)op1_reg }, + }; +} +Line s_jmp_i(uint16_t op1_imm) +{ + return (Line) { + .ty = LineTy_Jmp_Imm, + .op1 = (Ex) { .imm = op1_imm }, + }; +} Line s_jmp_l(int op1_label) { return (Line) { @@ -38,14 +53,35 @@ Line s_jmp_l(int op1_label) .op1 = (Ex) { .label = op1_label }, }; } +Line s_jnz_r(Reg op1_reg, Reg op2_reg) +{ + return (Line) { + .ty = LineTy_Jnz_Reg, + .op2 = (Ex) { .reg = (uint16_t)op2_reg }, + }; +} +Line s_jnz_i(Reg op1_reg, uint16_t op2_imm) +{ + return (Line) { + .ty = LineTy_Jnz_Imm, + .op2 = (Ex) { .imm = op2_imm }, + }; +} Line s_jnz_l(Reg op1_reg, int op2_label) { return (Line) { .ty = LineTy_Jnz_Label, - .op1 = (Ex) { .reg = (uint16_t)op1_reg }, .op2 = (Ex) { .label = op2_label }, }; } +Line s_cmp_r(Reg op1_reg, Reg op2_reg) +{ + return (Line) { + .ty = LineTy_Cmp_Reg, + .op1 = (Ex) { .reg = (uint16_t)op1_reg }, + .op2 = (Ex) { .reg = (uint16_t)op2_reg }, + }; +} Line s_cmp_i(Reg op1_reg, uint16_t op2_imm) { return (Line) { @@ -54,6 +90,14 @@ Line s_cmp_i(Reg op1_reg, uint16_t op2_imm) .op2 = (Ex) { .imm = op2_imm }, }; } +Line s_cmp_l(Reg op1_reg, int op2_label) +{ + return (Line) { + .ty = LineTy_Cmp_Label, + .op1 = (Ex) { .reg = (uint16_t)op1_reg }, + .op2 = (Ex) { .label = op2_label }, + }; +} Line s_mov8_mr_r(Reg dst_reg, Reg op2_reg) { return (Line) {