X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=as%2Fmcs51%2Fasmain.c;h=a333cceae75c6568295119f5308125a712a600c6;hb=d7b30120ae115e8929d57e25038ca76dde13974e;hp=86d0da26690eced7f019a28a75d2355a081c1008;hpb=3cd209ff7a929f45b1ceea53ad020ccddecf3071;p=fw%2Fsdcc diff --git a/as/mcs51/asmain.c b/as/mcs51/asmain.c index 86d0da26..a333ccea 100644 --- a/as/mcs51/asmain.c +++ b/as/mcs51/asmain.c @@ -483,6 +483,7 @@ asmbl() char fn[PATH_MAX]; char *p; int d, n, uaf, uf; + static struct area *abs_ap; /* pointer to current absolute area structure */ laddr = dot.s_addr; lmode = SLIST; @@ -870,18 +871,31 @@ loop: } newdot(ap); lmode = SLIST; + if (dot.s_area->a_flag & A_ABS) + abs_ap = ap; break; case S_ORG: if (dot.s_area->a_flag & A_ABS) { - outall(); - dot.s_area->a_size += dot.s_addr - dot.s_org; - laddr = dot.s_addr = dot.s_org = absexpr(); + char buf[NCPS]; + laddr = absexpr(); + sprintf(buf, "%s%x", abs_ap->a_id, laddr); + if ((ap = alookup(buf)) == NULL) { + ap = (struct area *) new (sizeof(struct area)); + *ap = *areap; + ap->a_ap = areap; + strncpy(ap->a_id, buf, NCPS); + ap->a_ref = areap->a_ref + 1; + ap->a_size = 0; + ap->a_fuzz = 0; + areap = ap; + } + newdot(ap); + lmode = ALIST; + dot.s_addr = dot.s_org = laddr; } else { err('o'); } - outall(); - lmode = ALIST; break; case S_RADIX: