diff options
author | Jannis Harder <jix@jixco.de> | 2012-07-29 17:19:46 +0200 |
---|---|---|
committer | Jannis Harder <jix@jixco.de> | 2012-08-01 15:32:21 +0200 |
commit | c02c6c72d0eba5552b8dfe0365934cfbcf4619df (patch) | |
tree | b9beff4d0ee8c41ae5ef2036257db271cd0292dd | |
parent | 15e9012b77abf696d82d5c57341b43bf5462a0ed (diff) | |
download | yasm-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.c | 14 |
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); |