Assembly 在FASM中定义结构-在什么情况下,两种方法中的哪一种更好
在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
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,为什么?如果没有呢?