This code works as intended:
section .bss
var2: DB ?
X: DW ? ; works
With the reservations in opposite order, the code doesn't assemble:
section .bss
X: DW ?
var2: DB ? ; error with lines in other order
I got this error, even though I don't use this label, var2 on another part of the program (in fact, this is reproducible assembling just that code block as a 3-line file).
error: label `var2' changed during code generation [-w error=label-redef-late]
I think the var2 variable is overwritten by the X variable because it's a word, on 2 bytes.
I am using NASM, version 2.15.04 to assemble this code (also reproducible with 2.15.05).
CodePudding user response:
After some debugging and poking around in the source code I can confirm my initial suspicion that this is a bug.
The size calculation for instructions of the form Dx ? (i.e. any Dx which includes a uninitialized storage token ?) where Dx is larger than DB internally returns the wrong size (assuming elements of 1 byte instead of the appropriate element size). This has the side effect of inconsistently altering the segment offset of any label following the instruction, causing a mismatch in the final code generation stage which is caught by a couple of checks and makes NASM error out.
Normally I would've simply reported the bug, but since NASM's GitHub repo does not have an "Issues" page active and their Bugzilla currently disallows registration I went ahead and submitted a pull request. The fix seems quite simple, unless there's something that I'm missing, in which case we'll find out (hopefully) soon.
