下面这段代码实现以一个链表,目前他支持的操作是初始化,如下面这段代码所示,为了简化指针的使用,将指针重命名为LinkedList标号。类似于高级语言中的链表实现流程,这里的LABEL的作用就相当于typedef 或者是rename操作。简化了后面的对其名字的引用的复杂程度。
; Creating a Linked List (List.asm)
; This program shows how the STRUC directive
; and the REPT directive can be combined to
; create a linked list at assembly time.
INCLUDE Irvine32.inc
ListNode STRUCT ;链表的结构体
NodeData DWORD ? ;链表的数据区域
NextPtr DWORD ? ;链表的指针域
ListNode ENDS
TotalNodeCount = 15 ;设置链表的长度
NULL = 0 ;链表的结尾
Counter = 0 ;当前的遍历位置
.data
LinkedList LABEL PTR ListNode ;定义链表的头结点 格式:变量/标号 LABEL 类型
REPT TotalNodeCount ;循环创建节点的操作15次
Counter = Counter + 1 ;设置当前节点的数值
ListNode <Counter, ($ + Counter * SIZEOF ListNode)> ;设置下一个节点的指向
ENDM
ListNode <0,0> ; tail node 设置尾节点,这里人为地设置以0位链表的末尾
.code
main PROC
mov esi,OFFSET LinkedList ;将esi指向链表的头结点
; Display the integers in the NodeData members.
NextNode: ;循环遍历这个链表
; Check for the tail node.
mov eax,(ListNode PTR [esi]).NextPtr ;获得指向下一个结点的指针
cmp eax,NULL ;如果结点为空,到了链表的末尾退出
je quit
; Display the node data.
mov eax,(ListNode PTR [esi]).NodeData ;否则指向下一个节点
call WriteDec ;将数据域赋值给eax,并输出打印
call Crlf ;换行
; Get pointer to next node.
mov esi,(ListNode PTR [esi]).NextPtr
jmp NextNode ;对下一个链表节点进行判断
quit:
call WaitMsg ;打印链表结束之后等待用户输入字符
exit ;退出程序
main ENDP
END main