如何将指针从同一结构传递到 nasm 中的结构?

How to pass a pointer from the same structure to the structure in nasm?

我正在 nasm 中开发一个链表,但我遇到了一个问题。对于以下和之前的指针的情况,我如何才能在相同的结构中添加结构的指针我将向您展示我想在 C 中做的事情以及我想在汇编程序中做的事情。

BITS 64

segment .bss
    struc list 
        val: resd 1
        next: resq 1  
        back: resq 1  
    endstruc

segment .text   

简而言之,这是我想做的事情

struct liste {
    int donnee;
    struct liste * precedent;
    struct liste * suivant;
};

您提供的汇编代码已经定义了与 C 结构相同的结构成员 - 在汇编语言中实际上没有输入。因此,当您执行 next: resq 1 时,您正在定义一个带有标签 next 的 8 字节 space,您可以在其中存储一个指针。

请注意,虽然这些结构具有相同的成员,但它们不是 ABI 兼容的,这意味着该结构不能在 C 和 ASM 代码之间按原样共享。这是由于结构内成员的对齐方式不同——因为 val 只是一个 4 字节值,在 ASM 结构中 next 将未对齐并从结构的字节 4 开始,而在 C 版本中,它将与 8 字节边界对齐,因此从结构的第 8 个字节开始。

要解决 C 和 ASM 之间的不匹配问题,您可以:

  1. 通过在结构定义中指定 __attribute__((packed))
  2. ,使 C 版本也紧密打包
  3. 在 ASM 结构定义中的 resq 之前指定 align 8,以将指针对齐到 8 字节边界