NASM - 如何创建结构指针数组并访问它们

时间:2014-10-16 19:15:05

标签: arrays pointers assembly struct nasm

所以我的问题是: 我有一个名为vertex的结构

struc vertex
  .x  resq 1
  .y  resq 1
  .z  resq 1
endstruc

我想创建一个指向由该定义构成的结构的指针数组。就像加载顶点表单文件并将它们保存在数组中的结构和指针中,以便稍后我可以访问它们。 有什么想法吗?

我唯一的想法是使用这样的东西:

modelVertices resb vertex_size*100

制作所有顶点的巨大“数组”并使其像

一样
[modelVertices+i*vertex_size]

其中i是我想要访问的顶点,那么我将如何访问顶点元素? 我现在不确定,但结构大小不完全只是elem1_size + elem2_size ...对吗?所以我不能通过添加元素的大小来访问它们以获得下一个没有?

有没有什么常用的方法来实现这个目标?

提前致谢并度过愉快的一天

编辑: 我试过这个

[modelVertices + vertexNumber*vertex_size + vertex.x]

要读取vertexNumberth顶点的x,我明白汇编允许我几乎所有内存都可以使用,所以它可以正常使用吗?

1 个答案:

答案 0 :(得分:2)

结构的元素是从结构的开始偏移,因此您只需添加偏移量即可访问元素:

[modelVertices+i*vertex_size + vertex.x]

您可能希望为此定义宏:

%define VERTEX(i, e)  [modelVertices+i*vertex_size + vertex. %+ e]

mov VERTEX(3, y), rax     ; move rax to y of vertex at index 3

编辑:如果要将寄存器用作索引,则必须单独计算乘法:

%define VERTEX(offset, e)  [modelVertices + offset + vertex. %+ e]

; calculate offset from start of the array
mov eax, vertex_size
mov edx, 3 ; index
mul edx

mov VERTEX(rax, y), rcx     ; move rcx to y of vertex at index 3

如果要创建指针数组而不是直接使用结构,可以创建qwords数组:

ptrArray resq 100 ; fill in the addresses somewhere

; ...

; get pointer to vertex at index i
%define VERTEX_PTR(i)   [ptrArray + i * 8]

%define VERTEX(ptr, e)  [ptr + vertex. %+ e]

mov rdx, VERTEX_PTR(3)
mov VERTEX(rdx, y), rax   ; move rax to y of vertex at index 3