我已经阅读了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的应用程序
答案 0 :(得分:3)
FASM中的struc
与macro
几乎相同,只在前面标有标签。
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