【问题标题】:Pointer for the first struct member list in nasm assemblynasm 程序集中第一个结构成员列表的指针
【发布时间】:2014-04-25 17:53:25
【问题描述】:

如何为这样的结构列表中的第一个元素声明一个指针:

section .bss
struc agenda
     name   resb 10
     number resd 10
     type   resw 10
endstruc

【问题讨论】:

  • nasm 手册对此含糊不清。

标签: assembly x86 nasm


【解决方案1】:

简单地声明结构不会为它保留内存。你需要它的一个实例。任何一个:

section .bss
    my_agenda resb agenda_size
; or perhaps...
    agenda_array resb agenda_size * MAX_COUNT
; or...
section .data
    an_agenda istruc agenda
    at name db "fred"
    at number db "42"
    at type db "regular"
    iend
section .text
    mov esi, an_agenda
    mov al, [esi + name]

类似的东西?

嘿! Jester 刚刚发布了基本相同的内容。他介绍了“。”本地标签的符号。可能是个好主意。没有它,name 是一个全局标识符,不能重用。它需要更多的输入 - agenda.nameagenda.numberagenda.type。可能值得为了提高清晰度。

【讨论】:

  • 弗兰克...没关系!感谢您的回复,但我不明白的是,如果我在结构内部有不同的大小,例如 resb、resw、resd ......并且结构超出 bss 和数据部分?
  • 不同尺寸都没有问题。这就是struc 本质上是“为”的。我不明白“越位 bss 和数据”。 struc 宏(是的,它是一个宏)本身只是一个“typedef”。要获得指向它的指针,您必须有一个 - 在 .bss 或 .data 中,或者可能在新分配的内存中。
【解决方案2】:

像往常一样,您应该在询问之前咨询罚款nasm manual。现在这样做还为时不晚,但我会从那里快速为您提供要点。

struc 本身不分配结构,它定义了一个类型。作为推荐的做法,您应该以点 (.) 开头的字段命名。每个字段标签将等于其在结构中的偏移量,但也可以添加基地址。声明结构后,您可以使用 istruc 指令分配初始化实例。在.bss 部分中,您可能希望使用resb,使用汇编程序为您定义的struc_size 符号。

声明类型、在 bss 部分定义零初始化实例并加载第一个成员的地址的完整示例可能如下所示:

struc agenda
     .name   resb 10
     .number resb 10
     .type   resb 10
endstruc

section .bss

myagenda: resb agenda_size

section .text
    mov eax, myagenda + agenda.name

注意:agenda.name 当然是0,我写出来只是为了说明你会如何为其他成员这样做。

【讨论】:

  • 抱歉,我忘记编辑我的问题了……在这种情况下没关系,但如果我改变地址的大小,比如我用 resd、resw 或 resb 编辑过的地址??
  • ahhh,那是因为我认为 myagenda: resb 议程大小和 resb、resd、resw 等类型定义之间的大小不兼容...感谢您的回复!
猜你喜欢
  • 1970-01-01
  • 2016-04-29
  • 1970-01-01
  • 2015-03-11
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-10
相关资源
最近更新 更多