汇编语言循环遍历链表代码分析(16)
2009-10-23 11:53
656 查看
来自于《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
以上程序便循环遍历了一个链表。
相关文章推荐
- 32位汇编语言学习笔记(8)--分析do-while循环的汇编代码
- 32位汇编语言学习笔记(9)--分析while循环的汇编代码
- [精华]]Linux内核2.6.14源码分析-双向循环链表代码分析(转)
- linux 内核源代码情景分析——linux 内核源码中的汇编语言代码
- 汇编语言AAA指令多字节加法代码分析(5)
- 汇编语言冒泡排序算法代码分析(12)
- 汇编语言GetDateTime代码分析(20)
- 汇编语言直接定指标的应用实验16代码
- 汇编语言值传递和引用传递代码分析(6)
- 汇编语言二分查找排序代码分析(13)
- 汇编语言秒表程序代码分析(21)
- 汇编代码对应的高级语言分析
- 汇编代码对应的高级语言分析
- Linux内核2.6.14源码分析-双向循环链表代码分析
- 汇编语言16位随机整数填充数组代码分析(7)
- 汇编语言显示系统时间代码分析(14)
- 高级语言的一段汇编代码分析
- 王爽 汇编语言第二版 实验9 根据材料编程 代码及分析
- 汇编代码对应的高级语言分析
- 王爽 汇编语言第二版 实验9 根据材料编程 代码及分析