2017-01-30 86 views
1

我讀過Fasm的文檔,但我弄不明白這一點。在NASM我第一次申報「的.bss」一個結構,然後在「數據」定義它:關於在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

我會建議FASM mesage板的https://board.flatassembler .net可能更好的答案 – Slai

+0

我不知道nasm,但通常「rb/rw/rd」只是「保留」一個字節/字/雙字,完全不觸及它(未初始化)。 「db?/ dw?/ dd?」也是一樣。要初始化它,你必須使用「db/dw/dd值」,例如'dw 2000'(單詞VALUE 2000)或'db 20'(字節20)。 'rw 2000'將保留一個2000字的塊 – Tommylee2k

+0

@Torito我不是所有的屁股家庭,所以我沒有概括。我只能假設它們都是一樣的(大部分?) – Tommylee2k

回答

2

應用在FASM的struc是幾乎相同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 structWindows programming headers手動宏實現。

如果您不想使用FASM struct宏,你仍然可以使用本機FASM的語法定義初始化的結構,方式如下:

; 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