2017-01-30 7 views
1

J'ai lu la documentation de Fasm, mais je ne peux pas comprendre cela. Dans Nasm Je voudrais tout d'abord déclarer une struct dans « .bss » puis définir dans « .data »:A propos de la déclaration et de l'initialisation d'une structure dans Fasm assembly

section ".bss" 

    struc my_struct 
     .a resw 1 
     .b resw 1 
     .c resb 1 
     .d resb 1 
    endstruc 

    section ".data" 

    my_struct_var1 istruc my_struct 
     at my_struct.a, dw 123 
     at my_struct.b dw, 0x123 
     at my_struct.c db, "fdsfds" 
     at my_struct.d db 2222 
    endstruc 

Comment puis-je faire en FASM exactement?

; declaring 

struct my_struct 
    .a rw 1 
    .b rw 1 
    .c rb 1 
    .d rb 1 
ends 

; or maybe this way? 
; what's the difference between these 2? 

struct my_struct 
    .a dw ? 
    .b dw ? 
    .c db ? 
    .d db ? 
ends 

1) Premièrement, est-ce correct? Ou devrais-je utiliser les macros "sturc {...}" Si oui, comment exactement?

2) Deuxièmement, comment puis-je l'initialiser dans ".data"?

3) aussi il y a une question dans mon code

Notez qu'il est une application pour Linux 64

+1

Je recommande le conseil d'administration mesage FASM https: //board.flatassembler .net pour une meilleure réponse possible – Slai

+0

Je ne sais pas nasm, mais habituellement "rb/rw/rd" ne "réserve" qu'un octet/mot/double mot, ne le touchant pas du tout (non initialisé). il en va de même pour "db?/dw?/dd?". Pour l'initialiser, vous devez utiliser "valeur db/dw/dd", par ex. 'dw 2000' (mot avec VALUE 2000) ou' db 20' (octet 20). 'rw 2000' réserverait un bloc de 2000 mots – Tommylee2k

+0

@Torito Je ne suis pas familliar avec tous les assmblers, donc je ne généralise pas. Je ne peux que supposer que c'est la même chose pour tous (la plupart?) D'entre eux – Tommylee2k

Répondre

2

Le struc dans FASM est presque le même que macro, seul le nom d'une étiquette à l'avant. Le struct est en fait une macro qui facilite les définitions.

Si vous utilisez FASM comprennent des fichiers où struct macro est défini, le code ci-dessous vous permettra d'initialiser les structures:

; declaring (notice the missing dots in the field names!) 

struct my_struct 
    a dw ? 
    b dw ? 
    c db ? 
    d db ? 
ends 

; using: 

MyData my_struct 123, 123h, 1, 2 

Vous pouvez en savoir plus sur la FASM struct de mise en œuvre macro dans le manuel Windows programming headers.

Si vous préférez ne pas utiliser la FASM struct macro, vous pouvez toujours définir des structures initialisées en utilisant la syntaxe native FASM, suivant ainsi:

; definition (notice the dots in the field names!) 

struc my_struct a, b, c, d { 
    .a dw a 
    .b dw b 
    .c db c 
    .d db d 
} 

; in order to be able to use the structure offsets in indirect addressing as in: 
; mov al, [esi+mystruct.c] 

virtual at 0 
    my_struct my_struct ?, ?, ?, ? 
end virtual 

; using: 

MyData my_struct 1, 2, 3, 4