nasm程序集中第一个struct成员列表的指针

时间:2014-04-25 17:53:26

标签: assembly x86 nasm

如何为结构列表中的第一个元素声明一个指针,如下所示:

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

2 个答案:

答案 0 :(得分:1)

像往常一样,在询问之前,你应该咨询罚款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,我已经写出来,只是为了说明你如何为其他成员做这件事。

答案 1 :(得分: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]

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] 那样的东西?

嘿!杰斯特刚刚发布了同样的事情。他介绍了'。'本地标签的表示法。可能是个好主意。没有它,是一个全局标识符,无法重用。输入需要稍微多一点 - nameagenda.nameagenda.number。可能值得提高清晰度。