nasm汇编中的双向链表

时间:2015-03-07 05:56:08

标签: assembly x86 nasm

我想在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

1 个答案:

答案 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