【发布时间】:2014-04-25 17:53:25
【问题描述】:
如何为这样的结构列表中的第一个元素声明一个指针:
section .bss
struc agenda
name resb 10
number resd 10
type resw 10
endstruc
【问题讨论】:
-
nasm 手册对此含糊不清。
如何为这样的结构列表中的第一个元素声明一个指针:
section .bss
struc agenda
name resb 10
number resd 10
type resw 10
endstruc
【问题讨论】:
简单地声明结构不会为它保留内存。你需要它的一个实例。任何一个:
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.name、agenda.number、agenda.type。可能值得为了提高清晰度。
【讨论】:
struc 本质上是“为”的。我不明白“越位 bss 和数据”。 struc 宏(是的,它是一个宏)本身只是一个“typedef”。要获得指向它的指针,您必须有一个 - 在 .bss 或 .data 中,或者可能在新分配的内存中。
像往常一样,您应该在询问之前咨询罚款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,我写出来只是为了说明你会如何为其他成员这样做。
【讨论】: