summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJannis Harder <jix@jixco.de>2012-07-29 17:19:46 +0200
committerJannis Harder <jix@jixco.de>2012-08-01 15:32:21 +0200
commitc02c6c72d0eba5552b8dfe0365934cfbcf4619df (patch)
treeb9beff4d0ee8c41ae5ef2036257db271cd0292dd
parent15e9012b77abf696d82d5c57341b43bf5462a0ed (diff)
downloadyasm-c02c6c72d0eba5552b8dfe0365934cfbcf4619df.tar.gz
Interpret vstart as linear address
Changed segment:offset calculations so that vstart = 16*segment + offset and vseg = segment instead of vstart = offset. Without this the existing code to infer vstart addresses is not useful.
-rw-r--r--modules/objfmts/bin/bin-objfmt.c14
1 files changed, 11 insertions, 3 deletions
diff --git a/modules/objfmts/bin/bin-objfmt.c b/modules/objfmts/bin/bin-objfmt.c
index 37056097..69264a90 100644
--- a/modules/objfmts/bin/bin-objfmt.c
+++ b/modules/objfmts/bin/bin-objfmt.c
@@ -512,11 +512,15 @@ get_ssym_value(yasm_symrec *sym, unsigned long line)
offset = yasm_intnum_copy(offset);
- if (bsymd->which == SSYM_VSTART && bsd->ivseg != NULL)
+ if (bsymd->which == SSYM_VSTART && bsd->ivseg != NULL) {
+ yasm_intnum *tmp = yasm_intnum_create_int(16);
+ yasm_intnum_calc(tmp, YASM_EXPR_MUL, bsd->ivseg);
+ yasm_intnum_calc(offset, YASM_EXPR_SUB, tmp);
+ yasm_intnum_destroy(tmp);
expr = yasm_expr_create(YASM_EXPR_SEGOFF,
yasm_expr_int(yasm_intnum_copy(bsd->ivseg)),
yasm_expr_int(offset), line);
- else
+ } else
expr = yasm_expr_create_ident(yasm_expr_int(offset), line);
return expr;
@@ -550,7 +554,11 @@ bin_objfmt_expr_xform(/*@returned@*/ /*@only@*/ yasm_expr *e,
yasm_expr *sube;
yasm_intnum *seg;
- seg = yasm_intnum_copy(bsd->ivseg);
+ seg = yasm_intnum_create_int(16);
+ yasm_intnum_calc(seg, YASM_EXPR_MUL, bsd->ivseg);
+ yasm_intnum_calc(dist, YASM_EXPR_SUB, seg);
+ yasm_intnum_set(seg, bsd->ivseg);
+
sube = yasm_expr_create(YASM_EXPR_SEGOFF,
yasm_expr_int(seg),
yasm_expr_int(dist), e->line);