nasm 程序集中的双向链表

doubly linked list in nasm assembly

我想在 Nasm 中做一个双向链表。

我有这个节点结构

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 中有一个指向新位置的指针(偏移量)。我的结构节点营地的位置在哪里(左、右、数据)。例如,我想创建一个没有邻居且值为 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

您的语法不正确。您忘记了每个结构成员开头的点。此外,resd 之后的值是结构中到 "reserve" 的数据项数。在这种情况下它应该是 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