NASM - The Netwide Assembler
NASM Forum => Using NASM => Topic started by: afk on February 18, 2012, 01:00:35 AM
-
Is there a NASM32 directive or command-line argument which will force every item in the .DATA
section to align on 2/4/8 etc. ? I know that ALIGN 2 will start the .DATA SECTION off on a word boundary but I'm interested in ensuring that every data ENTRY is aligned on a word boundary.
Thanks
afk
-
I think if you really want every data item aligned on a word boundary (why?), you'll need to use an "align" directive before every item. Be careful with version 2.09.10 (and maybe other versions?) - handling of "align" seems a little flukey. Look at a hex-dump or something to make sure you're really getting what you want...
Best,
Frank
-
Hi Frank,
Thanks for the quick reply.
Using ALIGN 2 before select items is one of my work-arounds.
(Why?) There seems to be a problem in Win2k (at least) when TextOutW is called to display unicode. Under certain conditions, if the unicode line isn't word-aligned then TextOutW fails. Reading loaded file data posed no problem because the system will always load it onto the
correct boundary. But the alignment of any given .DATA entry is based on what's ahead of it.
Thanks again.
afk
-
I vaguely remember this from my Win2k days. Several of the wide character API's had issues when the strings weren't aligned on a WCHAR boundary. Iirc, it spawned a discussion over at Pelles C forum because several users were confused as to why malloc()'d strings were failing under Win2k (solution was to use _aligned_malloc() instead). If you want it to be somewhat abstracted away, you can always do a macro wrapper:
%macro WCHAR 1+
DW __utf16__(%1)
%endmacro
%macro VARIABLE 2+
ALIGN 2
%1: %2
%endmacro
SECTION .data
VARIABLE myStringW, WCHAR "Hello, Unicode World"
VARIABLE myStringA, DB "Hello, ASCII World", 0
VARIABLE myInteger, DD 0
This will produce aligned variables:
[section .data]
[sectalign 2]
times (((2) - (($-$$) % (2))) % (2)) nop
myStringW:
DW __utf16__("Hello, Unicode World")
[sectalign 2]
times (((2) - (($-$$) % (2))) % (2)) nop
myStringA: DB "Hello, ASCII World", 0
[sectalign 2]
times (((2) - (($-$$) % (2))) % (2)) nop
myInteger: DD 0
Hope this helps.
Regards,
Bryant Keller
-
Hi Bryant
Sorry for not thanking you sooner. I didn't have instant notification turned on.
I didn't realize how old my version of NASM is until I tried to work out your macros and couldn't find any of the macro defs listed. But they appear to be a good solution and have been saved for future use.
Specifically, the Unicode problem appears (at least in Win2kPro), only if SetTextAlign and TA_UPDATECP are in force AND a .DATA item is misaligned.
All of the other functions which I tried (MessageBox etc.) seem to have no problem.
Thanks again
afk