From a0572e759f30bc653e36072a4b16310a0756fb01 Mon Sep 17 00:00:00 2001 From: julianb0 Date: Thu, 6 Jun 2019 15:06:34 +0200 Subject: [PATCH] fix --- as/k-as.py | 6 +++++- ka/main.k | 2 +- vm/pc/decd.c | 14 ++++++++++++++ vm/pc/dump.c | 6 ++++-- 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/as/k-as.py b/as/k-as.py index 74c6ac5..97c6074 100755 --- a/as/k-as.py +++ b/as/k-as.py @@ -386,10 +386,14 @@ def parse_instr(line): regoff = "inv" - # [reg+off] + # [reg+off] or [reg+regoff] if len(word.split('+')) == 2: reg, off = word.split('+', 1) + if not is_number(off): + regoff = off + off = '0' + # [reg+regoff+off] else: assert(len(word.split('+')) == 3) diff --git a/ka/main.k b/ka/main.k index 2be6a58..2876e57 100644 --- a/ka/main.k +++ b/ka/main.k @@ -26,7 +26,7 @@ main: mov rsi, 0x10 mov rdi, 8 - lea rbi, b[rsi + rdi] + lea rbi, b[rsi + rdi + 1] leave ret diff --git a/vm/pc/decd.c b/vm/pc/decd.c index f1f5549..f174df1 100644 --- a/vm/pc/decd.c +++ b/vm/pc/decd.c @@ -44,7 +44,21 @@ static void scan_param(ctx_t *ctx, acc_t *p) p->mem = 1; p->mlen = c & 0xF; p->off = (short)ctx->get(ctx); + p->offreg = ctx->get(ctx); + + if (p->offreg > NREGS) { + _except(ctx, E_ILL, "Inexistent REG (offreg)"); + } + + if (p->offreg != INV) { + r = &ctx->r[p->offreg]; + + if (r->flags & (RES | CTL)) { + _except(ctx, E_ACC, "Reserved REG (offreg): %s", r->name); + } + } + c = ctx->get(ctx); } diff --git a/vm/pc/dump.c b/vm/pc/dump.c index e37acb0..487da71 100644 --- a/vm/pc/dump.c +++ b/vm/pc/dump.c @@ -58,15 +58,17 @@ void dumpinstr(ctx_t *ctx, ulong _rip, uint rep, p = p1; lp: if (p != 0) { - if (p->mem) d_log(ctx, " %c:[", getmempref(p->mlen)); + if (p->mem) d_log(ctx, " %c[", getmempref(p->mlen)); else d_log(ctx, " "); if (p->type == A_REG) d_log(ctx, "%s", ctx->r[p->val].name); else - d_log(ctx, "%c:0x%lX", getmempref(p->ilen), p->val); + d_log(ctx, "%c0x%lX", getmempref(p->ilen), p->val); if (p->mem) { + if (p->offreg) + d_log(ctx, "+%s", ctx->r[p->offreg].name); if (p->off) d_log(ctx, "+%hd", p->off); d_log(ctx, "]");