来自于《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
以上程序便循环遍历了一个链表。
分享到:
相关推荐
总结起来,解决“百元百鸡”问题在ARM汇编中涉及的知识点包括:ARM汇编语言的基本语法,ADS1.2开发环境的使用,寄存器的运用,循环和分支结构的实现,数据运算指令,以及可能的内存管理和输出机制。通过这个实例,...
在给定的代码中,找到了一个跳转指令(jmp)用于形成循环,循环体内的代码负责遍历链表节点。当esi不再来自循环体外的eax时,可以确认esi是在循环内部更新的,这与链表遍历的特性相吻合。 为了更好地理解链表,可以...
在计算机科学领域,汇编语言是一种低级编程语言,它与机器代码紧密相关,每条指令都对应着特定的机器语言指令。在这个“汇编语言课程设计:鼠标操作绘制图案”的项目中,我们将深入探讨如何利用汇编语言来实现图形...
- **汇编语言**:一种与机器语言相对应的语言,通过助记符来代替二进制代码,便于理解和记忆。 - **高级语言**:如C、Java等,更接近人类自然语言,易于编程,但需要经过编译或解释才能被计算机执行。 #### 5. 数据...
汇编语言使用符号(或指令)来代表机器语言中的二进制代码,使得编程更为直观。每个汇编指令通常对应一个特定的机器语言操作码。例如,`MOV`指令用于数据的移动,`ADD`用于加法,`SUB`用于减法,等等。在汇编语言中...
在汇编语言中,可以使用数组或链表来实现队列,通过指针操作进行元素的入队和出队。 3. **双向链表**:双向链表允许在链表的前后两个方向上进行遍历。在汇编实现中,每个节点通常包含数据域和两个指针域,分别指向...
- 使用循环遍历链表,查找要删除的节点。 - 在循环条件中,需要检查当前节点`p`不为空且其数据不等于目标值`a`。 - 找到目标节点后,更新前一个节点`s`的`next`指向目标节点的下一个节点,然后释放目标节点。 2....
- 汇编语言程序的执行通常涉及到一系列的指令操作,包括数据的加载、存储、算术运算、逻辑运算以及控制流指令(如分支、循环等)。在示例程序中,程序通过执行XCHD(交换)、SWAP(交换高低字节)、ORL(按位逻辑或...
在汇编语言中,这通常需要通过循环和比较指令来实现。学生可能需要编写一段代码,以在内存中的一段字符数据中寻找特定的子串,并返回其起始位置或告知未找到。 再者,歌曲管理和图书管理系统的实现则要求学生具备...
7. 程序流程控制:汇编语言提供了分支、循环等控制结构,使得程序可以根据不同的条件执行不同的代码段,这对于实现系统的逻辑流程至关重要。 8. 存储管理:在内存有限的环境中,合理地分配和释放内存是必要的。汇编...
汇编语言中,我们可以使用INT 16H(键盘输入)和INT 10H(屏幕显示)这两个中断调用来实现。用户可以输入姓名和电话号码,然后通过特定指令将这些信息存储到内存中。 3. 查找功能:为了查找特定联系人,我们需要...
5. **条件语句和循环**:在处理成绩时,条件语句(如IF-THEN-ELSE)用于根据特定条件执行不同操作,而循环(如WHILE或FOR)用于重复执行一段代码,如遍历所有学生记录。 6. **函数和子程序**:为了代码复用和模块化...
这些题目涉及的计算机科学(CS)知识点主要集中在汇编语言编程上,汇编语言是一种低级编程语言,它与机器语言密切相关,用于编写计算机程序。以下是对各个题目的汇编语言实现相关知识点的详细说明: 1. **十进制转...
尽管现代编程更多地依赖高级语言,但掌握汇编语言能帮助开发者更好地理解底层工作原理,对于优化性能关键的代码段或者在资源受限的环境中编程是极其有价值的。 此外,这个项目也可以作为理解如何在没有高级语言支持...
通过循环结构遍历文本,进行查找。 - 删除操作:找到匹配项后,将后续内容前移覆盖被删除信息。 4. **程序框图**: - 主流程开始,显示主菜单,接受用户输入,根据输入执行对应的查找、插入或删除操作。 5. **...