我想在Nasm做一个双重链表。
我有这个Node
的结构struc node
left: resd 0
right: resd 0
data: resd 0
endstruc
当我想使用malloc
时,我会这样做push dword [node_sz]
call [malloc]
add esp, 4 * 1
其中:
node_sz dd 4*3
现在我在eax中指向新位置的指针(偏移量)。我的结构Node阵营的位置在哪里(左,右,数据)。例如,我想创建一个没有值为6的邻居的根。我是怎么做到的?
mov [eax + data] , DWORD 6
mov [eax +left],DWORD 0
mov [eax+right],DWORD 0
或者
mov [eax + 4*2] , DWORD 6
mov [eax +4*0],DWORD 0
mov [eax+4*1],DWORD 0
答案 0 :(得分:2)
您的语法不正确。你忘记了每个结构成员开头的点。此外,resd
之后的值是结构中“保留”的数据项数。在这种情况下应该是1,而不是0。
;; Declare a structure called "node".
;; Its size is an EQU named "node_size".
struc node
.left: resd 1
.right: resd 1
.data: resd 1
endstruc
;; External functions we wish to link against
extern malloc
start:
push node_size ;; Use this constant instead of manually calculating
call malloc
add esp, 4
mov [eax + node.left], DWORD 6
mov [eax + node.right], DWORD 7
mov [eax + node.data], DWORD 0xDEADBEEF
示例:
$ nasm -f elf struc.s
$ objdump -Mintel -d struc.o
struc.o: file format elf32-i386
Disassembly of section .text:
00000000 <start>:
0: 6a 0c push 0xc
2: e8 fc ff ff ff call 3 <start+0x3>
7: 83 c4 04 add esp,0x4
a: c7 00 06 00 00 00 mov DWORD PTR [eax],0x6
10: c7 40 04 07 00 00 00 mov DWORD PTR [eax+0x4],0x7
17: c7 40 08 ef be ad de mov DWORD PTR [eax+0x8],0xdeadbeef