aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Chambers <[email protected]>2021-10-06 14:26:51 +1300
committerAndrew Chambers <[email protected]>2021-10-06 14:26:51 +1300
commit60986d0a98a0549a08b361bc62534f8ed864015c (patch)
tree057ae3e06f01ae08def7cc90ae13281733fdaff3
parentd19ea712e8cc3bcf86fdd624a297c7b3c31d3f27 (diff)
Add more instructions.
-rw-r--r--asm.peg2
-rw-r--r--main.c3
-rw-r--r--minias.h3
-rw-r--r--test/test.sh1
4 files changed, 9 insertions, 0 deletions
diff --git a/asm.peg b/asm.peg
index d5c222a..9dbfeb6 100644
--- a/asm.peg
+++ b/asm.peg
@@ -30,11 +30,13 @@ jmp = "jmp" ws i:ident
mod-rm-binop = "add" a:mod-rm-binop-args { $$ = a; $$.kind = ASM_ADD; }
| "and" a:mod-rm-binop-args { $$ = a; $$.kind = ASM_AND;}
+ | "lea" a:mod-rm-binop-args { $$ = a; $$.kind = ASM_LEA;}
| "or" a:mod-rm-binop-args { $$ = a; $$.kind = ASM_OR;}
| "sub" a:mod-rm-binop-args { $$ = a; $$.kind = ASM_SUB;}
| "xor" a:mod-rm-binop-args { $$ = a; $$.kind = ASM_XOR;}
+
mod-rm-binop-args =
"q" ws s:r-m64 ws? ',' ws? d:r64
{ $$.modrmbinop = (ModRMBinop){ .type = 'q', .src = dupv(&s), .dst = dupv(&d) } }
diff --git a/main.c b/main.c
index 13c6717..fc95414 100644
--- a/main.c
+++ b/main.c
@@ -259,6 +259,7 @@ static void assemble() {
break;
case ASM_ADD:
case ASM_AND:
+ case ASM_LEA:
case ASM_OR:
case ASM_SUB:
case ASM_XOR: {
@@ -345,6 +346,8 @@ static void assemble() {
opcode = 0x03;
} else if (op->kind == ASM_AND) {
opcode = 0x23;
+ } else if (op->kind == ASM_LEA) {
+ opcode = 0x8d;
} else if (op->kind == ASM_SUB) {
opcode = 0x2b;
} else if (op->kind == ASM_XOR) {
diff --git a/minias.h b/minias.h
index 735812e..a800e2b 100644
--- a/minias.h
+++ b/minias.h
@@ -49,6 +49,7 @@ typedef enum {
ASM_LEAVE,
ASM_ADD,
ASM_AND,
+ ASM_LEA,
ASM_OR,
ASM_SUB,
ASM_XOR,
@@ -140,6 +141,7 @@ typedef struct {
typedef ModRMBinop Add;
typedef ModRMBinop And;
+typedef ModRMBinop Lea;
typedef ModRMBinop Or;
typedef ModRMBinop Sub;
typedef ModRMBinop Xor;
@@ -153,6 +155,7 @@ union Parsev {
ModRMBinop modrmbinop;
Add add;
And and;
+ Lea lea;
Or or;
Xor xor;
Sub sub;
diff --git a/test/test.sh b/test/test.sh
index 9bd08f6..4b747fb 100644
--- a/test/test.sh
+++ b/test/test.sh
@@ -25,6 +25,7 @@ t () {
echo -n "."
}
+t "leaq (%rax), %rax"
t "addq (%rax), %rax"
t "andq (%rax), %rax"