我的任务是在类项目的平面汇编程序中创建链接列表的项目。我需要能够动态地存储单词。我理解模糊内存分配和de分配。我不明白的是将此分配转换为链接列表或如何在平面汇编器内创建链接列表。我已经在互联网上看了很多关于节点和内存段的例子,但是我不确定它们是如何组合在一起的。如果有人能解释我如何在平面汇编程序中实际创建链接列表,我将不胜感激。提前致谢。
答案 0 :(得分:0)
(单个)链接列表由按顺序指向彼此的节点组成。你有一个根节点,它保存数据并指向另一个节点,该节点保存数据并指向另一个节点,依此类推列表中的所有数据。
通常,您需要创建用于与列表交互的函数。他们将抽象地直接处理列表。最低限度,你会想要创建,插入,删除,获取和删除功能(删除整个列表)。
您需要知道指针的大小和数据的大小,以了解创建节点所需的分配大小。由于你是16位,你需要段(2个字节)和偏移量(2个字节)。用于存储2个字节数据(16位整数)的节点可以首先用下一个指针布置,然后是数据。所以布局是base = segment,base + 2 = offset,base + 4 = data。
因此,为了访问指向下一个节点的指针,指针指向es:ax
中的当前节点,您将首先获得下一个节点的第一个节点,然后是偏移量。
mov fs, [es:ax]
add ax, 2
mov cx, [ds:ax]
; fs:cs points to next node in list
要从fs:cx
中获取该节点的数据,我们会add cx, 4
然后mov dx, [fs:cx]
。
现在,您现在可以获取数据并获取下一个节点。这些是遍历链表所需的构建块。
要分配新列表,您将分配第一个节点(在存储16位整数的情况下为6个字节),在其段中放置0并进行偏移并将数据放入其数据槽中。所以,比如节点(你刚分配的6个字节的内存)是fs:cs
。你会
mov [fs:cx], 0
add cx, 2 ; assuming cx doesn't overflow...
mov [fs:cx], 0
add cx, 2
mov [fs:cx], `data`
要添加新节点,您将遍历列表(如上所述),直到找到结束。结尾是具有0段和偏移的节点。然后,您将为新节点分配6个字节。将指针存储到尾部的新节点。然后将数据存储在新节点中并使新节点的指针为0(就像上面代码中第一个节点所做的那样)。