关于在Fasm程序集

时间:2017-01-30 04:37:02

标签: assembly fasm

我已经阅读了Fasm的文档,但我无法弄清楚这一点。在Nasm中,我首先在“.bss”中声明一个结构,然后在“.data”中定义它:

    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 个答案:

答案 0 :(得分:3)

FASM中的strucmacro几乎相同,只在前面标有标签。

struct实际上是一个宏,使定义更容易。

如果您正在使用包含struct宏的FASM包含文件,则以下代码将允许您初始化结构:

; 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

您可以在Windows programming headers手册中详细了解FASM struct宏实现。

如果您不想使用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