My <a href="https://github.com/mcandre/mcandre/tree/master/gas/hello/freebsd">Hello World assembler</a> only works if I hardcode the message length. If I try to use pseudo-ops to calculate the length, the program either prints extra garbage, or fails to build.<div>
<br></div><div>Code:</div><div><br></div><div><font face="courier new, monospace">msg: .asciz "Hello World!\n"</font></div><div><font face="courier new, monospace">...</font></div><div><div><font face="courier new, monospace">push $14</font></div>
<div><font face="courier new, monospace">push $msg</font></div><div><font face="courier new, monospace">...</font></div><div><br></div><div>Trace:</div><div><br></div><div><div><font face="courier new, monospace">$ clang -c -o hello.o -arch i386 hello.s</font></div>
<div><font face="courier new, monospace">$ ld -o hello -macosx_version_min 10.6 -arch i386 hello.o</font></div><div><font face="courier new, monospace">$ ./hello</font></div><div><font face="courier new, monospace">Hello World!</font></div>
</div><div><br></div><div>Code:</div><div><br></div><div><font face="courier new, monospace">msg: .asciz "Hello World!\n"</font></div><div><font face="courier new, monospace"><b>len: .long .-msg</b></font></div>
<div><font face="courier new, monospace">...</font></div><div><font face="courier new, monospace">push $len</font></div><div><font face="courier new, monospace">push $msg</font></div><div><font face="courier new, monospace">...</font></div>
<div><br></div><div>Trace:</div><div><br></div><div><div><font face="courier new, monospace">$ clang -c -o hello.o -arch i386 hello.s</font></div><div><font face="courier new, monospace">$ ld -o hello -macosx_version_min 10.6 -arch i386 hello.o</font></div>
<div><font face="courier new, monospace">$ ./hello</font></div><div><font face="courier new, monospace">Hello World!</font></div><div><font face="courier new, monospace"> ?';? msgstdoutsys_exitsys_writekernel__mh_execute_headerstart</font></div>
</div><div><br></div><div>Code:</div><div><br></div><div><font face="courier new, monospace">msg: .asciz "Hello World!\n"</font></div><div><font face="courier new, monospace"><b>len = .-msg</b></font></div><div>
<font face="courier new, monospace">...</font></div><div><font face="courier new, monospace">push $len</font></div><div><font face="courier new, monospace">push $msg</font></div><div><font face="courier new, monospace">...</font></div>
<div><br></div><div>Trace:</div><div><br></div><div><div><font face="courier new, monospace">$ clang -c -o hello.o -arch i386 hello.s</font></div><div><font face="courier new, monospace">$ ld -o hello -macosx_version_min 10.6 -arch i386 hello.o</font></div>
<div><font face="courier new, monospace">ld: section __data (address=0x00002000, size=4294967279) would make the output executable exceed available address range for architecture i386</font></div></div><div><br></div><div>
What is the proper syntax for calculating the length of a hardcoded string in Clang/Gas? In NASM, I write <font face="courier new, monospace">len equ $-msg</font></div><div><br></div>-- <br><div></div>Cheers,<div><br></div>
<div>Andrew Pennebaker</div><div><a href="http://www.yellosoft.us" target="_blank">www.yellosoft.us</a></div>
</div>