来自于《Intel汇编语言程序设计》(第四版)第10章-----结构和宏。
首先,链表大家都不陌生,每个节点包含了一个data和一个link,其中Link指向了下一个节点的开始地址。最后一个节点的link保存的是一个空指针(NULL)。
另外本章是关于宏的,宏在汇编中的角色是非常重要的。不过以下的程序只是一个循环遍历链表的程序:
TITLE Creating a Linked List (List.asm)
INCLUDE Irvine32.inc
ListNode STRUCT
NodeData DWORD ?
NextPtr DWORD ?
ListNode ENDS
TotalNodeCount = 15
NULL = 0
Counter = 0
.data
LinkedList LABEL DWORD
REPEAT TotalNodeCount
Counter = Counter + 1
ListNode < Counter, ( $ + Counter * SIZEOF ListNode)>
ENDM
ListNode <0,0> ; tail node
.code
main PROC
mov esi , OFFSET LinkedList
; Display the integers in the NodeData fields.
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
call Crlf
; Get pointer to next node.
mov esi , ( ListNode PTR [esi]).NextPtr
jmp NextNode
quit:
exit
main ENDP
END main
还是用代码注释来代替分析:
TITLE Creating a Linked List (List.asm)
INCLUDE Irvine32.inc
ListNode STRUCT ; 定义链表节点结构体
NodeData DWORD ? ; 节点中用来保存值的成员
NextPtr DWORD ? ; 节点中用来保存下一个节点地址的成员
ListNode ENDS
TotalNodeCount = 15 ; 用来测试的数据,以便为节点中的NodeData赋值
NULL = 0
Counter = 0
.data
LinkedList LABEL DWORD
REPEAT TotalNodeCount ; 初始化15个节点
Counter = Counter + 1
ListNode < Counter, ( $ + Counter * SIZEOF ListNode)> ; $代表此链表的第一个节点的地址值,再加上相应的Counter * SIZEOF ListNode,就得到了每个节点的偏移地址。
ENDM
ListNode <0,0> ; tail node
.code
main PROC
mov esi , OFFSET LinkedList
; Display the integers in the NodeData fields.
NextNode:
; Check for the tail node.
mov eax , ( ListNode PTR [esi]).NextPtr ; 将此时(ESI所指向的)节点保存的下一个节点地址赋值到eax中
cmp eax , NULL ; 看看是否是最后一个节点
je quit ; 如果是,则退出
; Display the node data.
mov eax , ( ListNode PTR [esi]).NodeData ; 否则会执行这里,将此节点的数据成员赋值到eax中
call WriteDec ; 输出此时eax中的值
call Crlf
; Get pointer to next node.
mov esi , ( ListNode PTR [esi]).NextPtr ; 将下一个节点的地址保存到esi中
jmp NextNode ; 进入下一个节点
quit:
exit
main ENDP
END main
以上程序便循环遍历了一个链表。
分享到:
相关推荐
java 数据结构 遍历链表程序 有研究或探讨的请加群:37424970 或联系本人MSN或邮箱:zhuseahui@yahoo.com.cn
数据结构 初始化链表,插入删除节点,遍历链表,链表长度,找出中间节点
简单实用的创建和遍历链表代码
Java中遍历链表的代码清单.pdf 学习资料 复习资料 教学资源
单向链表(一) 结构体、创建链表、遍历链表
双向的循环链表的C++源代码 实现正逆序遍历,链表归并,插入,删除,查询等基本操作
图和二叉树;链表的建立;以及二叉树的遍历等等后序先序中序遍历
采用汇编语言实现动态链表,自己管理内存,实现malloc函数
linux内核使用的循环双向链表,供大家参考一下
链表 代码 链表 代码 链表 代码 链表 代码 链表 代码 链表 代码 链表 代码 链表 代码 链表 代码 链表 代码 链表 代码
遍历(打印)单向链表。 (3).把单向链表中元素逆置(不允许申请新的结点空间)。 (4).在单向链表中删除所有的偶数元素结点。 (5).对链表排序,排序后链表元素按照非递减方式排列(注意:排序时如果要交换两个结点...
Java数组链表效率-Java数组和链表三种遍历效率对比 数组和链表.pdf
循环链表的实现,包括查找删除修改的实现,其中详细介绍了循环链表的原理,以及各个部分的代码实现
双向循环链表,队列,代码详细实现,已进行详细备注。
循环链表源代码,自己分配内存,没有用任何STL的东西。
遍历数组和链表 数组和链表.pdf
数据结构中 单链表 双链表 循环链表 c语言代码。
循环链表结点设计(以单循环链表为例) 16 循环单链表初始化 17 循环链表的创建操作 18 循环单链表的插入操作 19 循环单链表的删除操作 20 循环单链表的遍历 22 进阶概念——双向循环链表 23 关于链表的总结 23
遍历链表并且输出内容到内核日志缓冲区。调用命令dmesg,以确保在模块加载时该列表构造正确。 在模块退出点,从链表中删除元素,并且将空闲内存返回到内核。另外,调用命令dmesg,以检查在模块卸载时该列表已被删除...
循环(loop)、遍历(traverse)、迭代(iterate)、递归(recursion)都有重复的概念。大部分的遍历、迭代、递归都是循环。 递归 递归是函数重复调用自身形成的循环。 循环 循环(loop),指的是在满足条件的情况下...