diff options
| author | Andrew Chambers <[email protected]> | 2021-10-06 14:26:51 +1300 |
|---|---|---|
| committer | Andrew Chambers <[email protected]> | 2021-10-06 14:26:51 +1300 |
| commit | 60986d0a98a0549a08b361bc62534f8ed864015c (patch) | |
| tree | 057ae3e06f01ae08def7cc90ae13281733fdaff3 | |
| parent | d19ea712e8cc3bcf86fdd624a297c7b3c31d3f27 (diff) | |
Add more instructions.
| -rw-r--r-- | asm.peg | 2 | ||||
| -rw-r--r-- | main.c | 3 | ||||
| -rw-r--r-- | minias.h | 3 | ||||
| -rw-r--r-- | test/test.sh | 1 |
4 files changed, 9 insertions, 0 deletions
@@ -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) } } @@ -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) { @@ -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" |
