NASM - The Netwide Assembler

NASM Forum => Using NASM => Topic started by: afk on February 18, 2012, 01:00:35 AM

Title: Data alignment
Post 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
Title: Re: Data alignment
Post by: Frank Kotler on February 18, 2012, 01:35:58 AM
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

Title: Re: Data alignment
Post by: afk on February 18, 2012, 01:53:29 AM
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
Title: Re: Data alignment
Post by: Bryant Keller on February 19, 2012, 04:56:01 AM
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:

Code: [Select]
%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:

Code: [Select]
[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
Title: Re: Data alignment
Post by: afk on March 07, 2012, 06:03:25 PM
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