NASM - How to make array of struct pointers and access them
所以我的问题是:
我有一个名为 vertex
的结构
1 2 3 4 5 | struc vertex .x resq 1 .y resq 1 .z resq 1 endstruc |
我想创建一个指向由该定义构成的结构的指针数组。就像加载顶点表单文件并将它们保存在结构和数组中的指针中,以便我以后可以访问它们。
有什么想法吗?
我唯一的想法是使用这样的东西:
1 | modelVertices resb vertex_size*100 |
制作这个包含所有顶点的巨大"数组"并像访问它一样
1 | [modelVertices+i*vertex_size] |
我要访问的顶点在哪里,那么我将如何访问顶点元素?
我现在不确定,但结构大小不仅仅是 elem1_size elem2_size ......对吗?所以我不能仅仅通过添加元素的大小来访问它们以获取下一个元素吗?
有什么常见的方法可以实现吗?
提前致谢,祝你有美好的一天
编辑:
我试过这个
1 | [modelVertices + vertexNumber*vertex_size + vertex.x] |
要读取 vertexNumberth 顶点的 x,我知道程序集允许我用内存做几乎所有事情,所以它可以工作,但这是正确的用法吗?
结构的元素是从结构开始的偏移量,因此您可以通过添加偏移量来访问元素:
1 | [modelVertices+i*vertex_size + vertex.x] |
您可能想为此定义宏:
1 2 3 | %define VERTEX(i, e) [modelVertices+i*vertex_size + vertex. %+ e] mov VERTEX(3, y), rax ; move rax to y of vertex at index 3 |
编辑:如果要使用寄存器作为索引,则必须单独计算乘法:
1 2 3 4 5 6 7 8 | %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 数组:
1 2 3 4 5 6 7 8 9 10 11 | 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 |