2017-01-30 1 views
1

Я прочитал документацию Fasm, но я не могу это понять. В NASM я первым объявить структуры в «.bss», а затем определить его в «.data»:Об объявлении и инициализации структуры в сборке Fasm

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 

Как я могу сделать это в FASM именно?

; 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) Во-первых, это правильно? Или я должен использовать макросы "sturc {...}" Если да, то как именно?

2) Во-вторых, как я могу инициализировать его в «.data»?

3) также есть вопрос в моем коде

Примечание это приложение для Linux 64

+1

Я бы рекомендовал борт протокол HTTPS FASM электронного письмо: //board.flatassembler .net для возможного лучшего ответа – Slai

+0

Я не знаю nasm, но обычно «rb/rw/rd» просто «резервирует» байтовое/слово/двойное слово, не касаясь его вообще (неинициализированный). То же самое делает «db?/dw?/dd?». Чтобы инициализировать его, вы должны использовать «db/dw/dd value», например. 'dw 2000' (слово с VALUE 2000) или' db 20' (байт 20). 'rw 2000' зарезервировал бы блок из 2000 слов – Tommylee2k

+0

@Torito Я не familliar со всеми assmblers, поэтому я не обобщаю. Я могу только предположить, что это одно и то же для всех (большинство?) Из них – Tommylee2k

ответ

2

struc в FASM почти так же, как macro, только с именем с меткой на фронте.

struct - фактически макрос, который упрощает определение.

Если вы используете FASM включает файлы, где определен struct макроса, следующий код позволит вам инициализировать структуры:

; 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 

Вы можете прочитать больше о FASM struct макро реализации в Windows programming headers руководства.

Если вы предпочитаете не использовать FASM struct макроса, вы можете определить инициализированные структуры с использованием нативного синтаксиса ФАПО, следующим образом:

; 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 
Смежные вопросы