Assembly 在FASM中定义结构-在什么情况下,两种方法中的哪一种更好

Assembly 在FASM中定义结构-在什么情况下,两种方法中的哪一种更好,assembly,fasm,Assembly,Fasm,在FASM中,定义结构有两种方法: struc point x, y, z { .x db x, .y db y, .z db z } 及 我应该在什么时候使用哪个?简短回答: 使用struct/ends 说明: 这两种结构相似,但仍有本质区别 struc指令: 第一个使用struc指令。它非常类似于宏指令,只是创建结构的模板。但是,在您创建此模板的“实例”之前,它实际上并不存在。将编译以下示例,但有错误: struc POINT { .x dd ? .y

在FASM中,定义结构有两种方法:

struc point x, y, z
{
    .x db x,
    .y db y,
    .z db z
}

我应该在什么时候使用哪个?

简短回答: 使用
struct/ends

说明: 这两种结构相似,但仍有本质区别

struc指令: 第一个使用
struc
指令。它非常类似于
指令,只是创建结构的模板。但是,在您创建此模板的“实例”之前,它实际上并不存在。将编译以下示例,但有错误:

 struc POINT {
   .x dd ?
   .y dd ?
 }

mov eax, [esi+POINT.x]
另一方面,以下代码将正确编译:

struc POINT {
  .x dd ?
  .y dd ?
}
myPoint POINT

mov eax, [myPoint.x]
struct POINT
  .x dd ?
  .y dd ?
ends

myPoint1 POINT
myPoint2 POINT

lea esi, [myPoint1]

mov eax, [esi+POINT.x]
mov [myPoint2.x], eax
mov ecx, sizeof.POINT
但这不会:

lea esi, [myPoint]
mov eax, [esi+POINT.x]
上面示例中的要点只是一个模板,而不是定义了偏移量、大小等的结构

结构/结束宏: 创建宏
struct/ends
是为了解决
struc
指令的上述缺点。除了创建模板外,他们还在地址0处创建此模板的一个实例,并在sizeof中创建一个标签。地址空间,包含结构的大小

下面的
struct
定义

struct POINT
  .x dd ?
  .y dd ?
ends
…大约等于以下原始定义:

struc POINT {
  .x dd ?
  .y dd ?
}

virtual at 0
  POINT POINT
  sizeof.POINT = $ - POINT
end virtual
这就是为什么我们有两个-模板和真正的偏移标签。使用
struct
以上所有示例代码将正确编译:

struc POINT {
  .x dd ?
  .y dd ?
}
myPoint POINT

mov eax, [myPoint.x]
struct POINT
  .x dd ?
  .y dd ?
ends

myPoint1 POINT
myPoint2 POINT

lea esi, [myPoint1]

mov eax, [esi+POINT.x]
mov [myPoint2.x], eax
mov ecx, sizeof.POINT
请注意,上面的“equial”代码仅用于说明。
struct
宏的实际实现可能有所不同。例如,FreshLib库使用上述方法,而FASM宏库使用另一种方法,以避免字段名称中出现点,并实现更多功能,如字段初始化等


但是最终的结果是或多或少的相等加/减小细节。

如果您想要一些MASM兼容性,第二个版本会更好。@zx485,为什么?如果没有呢?