Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



NASM - align 16

Seznam témat     Nová odpověď

Přihlásit se     Registrace     Zapomenuté heslo

Re: NASM - align 16

Autor: AnonymousUser

4:18:02 22.11.2008

NASM to defaultně dorovná nopem, ale dá se jinak zvolit.

Jinak osobně vím, že align nefunguje v nasm tak jak by měl - a nahlásil jsem chybu do nasm týmu. A sám jsem si napsal makro na obejití.

align nefunguje v nasm vysloveně chybně, ale neefektivně - pokud je další adresa už zarovnaná na 16 bajtů, zcela zbytečně vloží 2 nopy - tedy vkládá vždy něco jen aby něco vložil.

Moje náhradní makro do nasm vypadá takto:

[quote]
; AlignSpaceFromLabel label number filler
%macro AlignSpaceFromLabel 3.nolist
%%begin_space:
%if ((%%begin_space - %1) % %2) > 0
%rep %2 - ((%%begin_space - %1) % %2)
%3
%endrep
%endif
%endmacro
[/quote]


Makro AlignSpaceFromLabel má 3 parametry, první je návěští (label), od kterého se zarovnává, druhý je číslo, na které se zarovnává (takže ve Vašem případě 16), a třetí parametr je znak, kterým se mají vyplnit zarovnávací prostory.

Pro zarovnání třeba v kódu pak začnu zdrojový kód v asm takto:

[quote]
section .text align=16
__CodeBegin:

%macro AlignCodeSpace 1.nolist
AlignSpaceFromLabel ____CodeSectionStart, %1, db 0x90
%endmacro

mov eax, 1
; Zarovnej na 16 bajtů.
AlignCodeSpace 16
mov esi, 2
[/quote]

Miloslav Ponkrác

Citovat příspěvek

 

Re: NASM - align 16

Autor: MazeGen

16:03:20 30.10.2008

Tady je ukázka s MASM. Zdroják:

[code]
.686
.MODEL FLAT, STDCALL

.DATA
DD 0DEADBEEFh ; zruš zarovnání

ALIGN 16

DB "hrb"

.CODE
Start:
nop ; zruš zarovnání
ALIGN 16
mov eax, ecx
END Start
[/code]

To "zruš zarovnání" je tam proto, že sekce jsou při zavedení do paměti dost pravděpodobně zarovnány na určitou hodnotu.

Vyrobil jsem .OBJ a pomocí DUMPBIN jsem si vytáhnul kód:

[code]
File Type: COFF OBJECT

_Start:
00000000: 90 nop
00000001: 8D A4 24 00 00 00 lea esp,[esp+00000000h]
00
00000008: 8D A4 24 00 00 00 lea esp,[esp+00000000h]
00
0000000F: 90 nop
00000010: 8B C1 mov eax,ecx
[/code]

Takže to zarovnání je dosaženo dvěma instrukcemi LEA (14 bajtů) a jedním NOPem.

Takhle vypadají raw data datové sekce:

[code]
RAW DATA #2
00000000: EF BE AD DE 00 00 00 00 00 00 00 00 00 00 00 00 i3­?............
00000010: 68 72 62 hrb
[/code]

Tady byly doplněny nuly.

Citovat příspěvek

 

Re: NASM - align 16

Autor: MazeGen

16:48:31 29.10.2008

Konkrétně NASM nepoužívám, ale obecně to tak je.

V kódu by měl dorovnat instrukcemi NOP, v datech na tom moc nezáleží, ale nejspíš to budou nuly nebo 0xCC (int3).

Nejlepší je napsat si triviální test, zassemblovat ho, podívat se do listingu (to asi NASM neumí) nebo si dumpnout výslednej soubor a podívat se.

Citovat příspěvek

 

NASM - align 16

Autor: frca

19:19:35 28.10.2008

Co přesně dělá makro align 16? Dorovná bajty tak, aby adresa následujícího hned za ním začínala na adrese beze zbytku dělitelné 16? V manuálu to je, ale raději bych to česky a polopaticky ;)
A pokud to tak je, čím to dorovná? Nulami?
Díky,
frca

Citovat příspěvek

 

 

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: