diff --git a/src/salink.c b/src/salink.c index bfe8810..9ed2e2a 100644 --- a/src/salink.c +++ b/src/salink.c @@ -441,7 +441,8 @@ static void prv_complete_absolutes_e(void) align = 1 << label->id; mask = align - 1; adjust = (real_off + label->off) & mask; - real_off += align - adjust; + if (adjust > 0) + real_off += align - adjust; continue; } if (label->off > 0xffff - real_off) { diff --git a/src/state_base.h b/src/state_base.h index b84ba1e..04ab930 100644 --- a/src/state_base.h +++ b/src/state_base.h @@ -17,8 +17,8 @@ #ifndef SPECASM_STATE_READ_H #define SPECASM_STATE_READ_H -#define SPECASM_VERSION 2 -#define SPECASM_VERSION_STR "v2" +#define SPECASM_VERSION 3 +#define SPECASM_VERSION_STR "v3" #include diff --git a/tests/test_align_aligned/align_aligned.s b/tests/test_align_aligned/align_aligned.s new file mode 100644 index 0000000..cc676d9 --- /dev/null +++ b/tests/test_align_aligned/align_aligned.s @@ -0,0 +1,9 @@ +.Main +align 8 +ld hl, l1 +.l1 +nop +ld hl, l2 +align 8 +.l2 +ret diff --git a/tests/test_align_aligned/test.sh b/tests/test_align_aligned/test.sh new file mode 100755 index 0000000..de374ec --- /dev/null +++ b/tests/test_align_aligned/test.sh @@ -0,0 +1,21 @@ +#!/bin/bash + +set -e +rm align_aligned 2>/dev/null 1>&2 || true +rm *.x 2>/dev/null 1>&2 || true + +../../saimport *.s +../../salink 2>/dev/null 1>&2 +offset=`od -An -j1 -t x1 -N2 align_aligned | xargs` +if [ "$offset" != "03 80" ]; then + exit 1 +fi + +offset=`od -An -j5 -t x1 -N2 align_aligned | xargs` +if [ "$offset" != "08 80" ]; then + exit 1 +fi + +rm align_aligned +rm *.x +