]> granicus.if.org Git - yasm/commitdiff
Interpret vstart as linear address
authorJannis Harder <jix@jixco.de>
Sun, 29 Jul 2012 15:19:46 +0000 (17:19 +0200)
committerJannis Harder <jix@jixco.de>
Wed, 1 Aug 2012 13:32:21 +0000 (15:32 +0200)
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.

modules/objfmts/bin/bin-objfmt.c

index 370560970ce8c0b984c7d5fd96697b5ecef29235..69264a90829db359ab640b76ad87235ee9e04c8c 100644 (file)
@@ -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);