all jmp, jnz, cmp
This commit is contained in:
parent
ba623b5e23
commit
d29293b84c
62
asm/asm.c
62
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;
|
out[ip++] = Op_Hlt;
|
||||||
break;
|
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: {
|
case LineTy_Jmp_Label: {
|
||||||
int op1 = line->op1.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);
|
ADD_LABEL(op1);
|
||||||
break;
|
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: {
|
case LineTy_Jnz_Label: {
|
||||||
uint16_t op1 = line->op1.reg;
|
uint16_t op1 = line->op1.reg;
|
||||||
int op2 = line->op2.label;
|
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);
|
ADD_LABEL(op2);
|
||||||
break;
|
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: {
|
case LineTy_Cmp_Imm: {
|
||||||
uint16_t op1 = line->op1.reg;
|
uint16_t op1 = line->op1.reg;
|
||||||
uint16_t op2 = line->op2.imm;
|
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++] = (uint16_t)ins;
|
||||||
out[ip++] = op2;
|
out[ip++] = op2;
|
||||||
break;
|
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;
|
break;
|
||||||
}
|
}
|
||||||
case LineTy_Mov8_MemReg_Reg: {
|
case LineTy_Mov8_MemReg_Reg: {
|
||||||
|
12
asm/asm.h
12
asm/asm.h
@ -10,9 +10,15 @@ typedef enum {
|
|||||||
LineTy_DataLabel,
|
LineTy_DataLabel,
|
||||||
LineTy_Nop,
|
LineTy_Nop,
|
||||||
LineTy_Hlt,
|
LineTy_Hlt,
|
||||||
|
LineTy_Jmp_Reg,
|
||||||
|
LineTy_Jmp_Imm,
|
||||||
LineTy_Jmp_Label,
|
LineTy_Jmp_Label,
|
||||||
|
LineTy_Jnz_Reg,
|
||||||
|
LineTy_Jnz_Imm,
|
||||||
LineTy_Jnz_Label,
|
LineTy_Jnz_Label,
|
||||||
|
LineTy_Cmp_Reg,
|
||||||
LineTy_Cmp_Imm,
|
LineTy_Cmp_Imm,
|
||||||
|
LineTy_Cmp_Label,
|
||||||
LineTy_Mov8_MemReg_Reg,
|
LineTy_Mov8_MemReg_Reg,
|
||||||
LineTy_Mov8_MemImm_Imm,
|
LineTy_Mov8_MemImm_Imm,
|
||||||
LineTy_Mov8_MemImm_Reg,
|
LineTy_Mov8_MemImm_Reg,
|
||||||
@ -92,9 +98,15 @@ Line s_data_i(uint16_t data);
|
|||||||
Line s_data_l(int label);
|
Line s_data_l(int label);
|
||||||
Line s_nop(void);
|
Line s_nop(void);
|
||||||
Line s_hlt(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_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_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_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_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_i(uint16_t dst_imm, uint16_t op2_imm);
|
||||||
Line s_mov8_mi_r(uint16_t dst_imm, Reg op2_reg);
|
Line s_mov8_mi_r(uint16_t dst_imm, Reg op2_reg);
|
||||||
|
46
asm/ctors.c
46
asm/ctors.c
@ -1,4 +1,5 @@
|
|||||||
#include "asm.h"
|
#include "asm.h"
|
||||||
|
#include "common/arch.h"
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
Line s_label(int label)
|
Line s_label(int label)
|
||||||
@ -31,6 +32,20 @@ Line s_hlt(void)
|
|||||||
{
|
{
|
||||||
return (Line) { .ty = LineTy_Hlt };
|
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)
|
Line s_jmp_l(int op1_label)
|
||||||
{
|
{
|
||||||
return (Line) {
|
return (Line) {
|
||||||
@ -38,14 +53,35 @@ Line s_jmp_l(int op1_label)
|
|||||||
.op1 = (Ex) { .label = 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)
|
Line s_jnz_l(Reg op1_reg, int op2_label)
|
||||||
{
|
{
|
||||||
return (Line) {
|
return (Line) {
|
||||||
.ty = LineTy_Jnz_Label,
|
.ty = LineTy_Jnz_Label,
|
||||||
.op1 = (Ex) { .reg = (uint16_t)op1_reg },
|
|
||||||
.op2 = (Ex) { .label = op2_label },
|
.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)
|
Line s_cmp_i(Reg op1_reg, uint16_t op2_imm)
|
||||||
{
|
{
|
||||||
return (Line) {
|
return (Line) {
|
||||||
@ -54,6 +90,14 @@ Line s_cmp_i(Reg op1_reg, uint16_t op2_imm)
|
|||||||
.op2 = (Ex) { .imm = 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)
|
Line s_mov8_mr_r(Reg dst_reg, Reg op2_reg)
|
||||||
{
|
{
|
||||||
return (Line) {
|
return (Line) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user