【问题标题】:NASM - How to make array of struct pointers and access themNASM - 如何制作结构指针数组并访问它们
【发布时间】:2014-12-12 06:40:14
【问题描述】:

所以我的问题是: 我有一个叫做顶点的结构

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

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

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

modelVertices resb vertex_size*100

制作这个包含所有顶点的巨大“数组”并像访问它一样

[modelVertices+i*vertex_size]

我要访问的顶点在哪里,那么我将如何访问顶点元素? 我现在不确定,但结构大小不仅仅是 elem1_size+elem2_size ......对吗?所以我不能仅仅通过添加元素的大小来访问它们以获取下一个不?

有什么常见的方法可以实现吗?

提前致谢,祝你有美好的一天

编辑: 我试过这个

[modelVertices + vertexNumber*vertex_size + vertex.x]

要读取 vertexNumberth 顶点的 x,我了解程序集允许我使用内存执行几乎所有操作,因此它可以正常工作,但这是正确的用法吗?

【问题讨论】:

    标签: arrays pointers assembly struct nasm


    【解决方案1】:

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

    [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
    

    【讨论】:

    • 非常感谢,第一个看起来很简单,对我来说非常有用。
    • 嗯还有一件事我不明白,为什么我不能像这样在宏寄存器或内存中作为第一个参数传递:vertex([i],z)
    • 内存引用会导致宏在方括号内渲染方括号,这是无效的。将 vertex_size 大于 8 的寄存器相乘也会产生无效地址。我将编辑答案以包含更多动态宏。
    • 感谢您抽出宝贵时间。我只需要一些我可以迭代并像这样填充整个数组的东西。我试图以某种方式对其进行编辑,但仍然无法正常工作。
    • 亲切,非常感谢。哈,如此简单的解决方案,我并没有想到。谢谢,谢谢...
    猜你喜欢
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 2021-09-13
    • 1970-01-01
    • 2012-01-30
    • 2014-04-11
    • 2021-10-11
    • 2013-06-11
    相关资源
    最近更新 更多