《Intel汇编语言程序设计》(第四版)第六章中的代码,如下:
.data
array SWORD -3 , -6 , -1 , -10 , 10 , 30 , 40 , 4
sentinel SWORD 0
.code
mov esi , OFFSET array
mov ecx , LENGTHOF array
next:
test WORD PTR [esi] , 8000h ; test sign bit
pushfd ; push flags on stack
add esi , TYPE array
popfd ; pop flags from stack
loopnz next ; continue loop
jnz quit ; none found
sub esi , TYPE array ; ESI points to value
quit:
让我们逐句分析。
程序在数据段定义了一个数组和一个变量:
.data
array SWORD -3 , -6 , -1 , -10 , 10 , 30 , 40 , 4
sentinel SWORD 0
然后,程序对 esi 和 ecx 进行赋值:
mov esi , OFFSET array
mov ecx , LENGTHOF array
将 esi 指向了数组array的第一个元素地址,并将array数组长度赋值给ecx。
接着,开始在数组中查找是否有正数,代码如下:
next:
test WORD PTR [esi] , 8000h ; 使用test伪指令对最高位进行“与”操作,如果为1则零标志ZF会被置1 pushfd ; 保存标志位到堆栈(不明白这里为什么要保存标志位,但肯定是因为下面的操作会影响到标志位)
add esi , TYPE array ; 将esi指向下一个数组元素地址
popfd ; 从堆栈中弹出标志位
loopnz next ; 在ECX中的无符号值大于0并且零标志位被清除的状态下进行循环
jnz quit ; 如果数组中未找到正数,则跳到quit标号处
sub esi , TYPE array ; 如果找到了正数,则将esi减掉array元素类型即为正数地址
quit:
首先是几个伪指令的含义:
LOOPNZ指令的作用是,在ECX中的无符号值大于0并且零标志位被清除的状态下进行循环。
而TEST指令的作用是,只有当所有的测试位都被清除的时候,零标志位ZF才被置1。
JNZ指令的作用是,ZF=0时跳转。
整个程序的思路是这样的:
程序对每一个元素值的高位进行test测试,当是负数的时候,最高位是1,此时使用8000h(8000h 即 1000 000 000 000b)进行test的结果是测试位并不全为零,所以此时零标志位ZF被置为0,满足loopnz的两个条件,会继续执行。当最高位不是1的时候,则为正数,此时使用8000h进行test的结果是,所有测试位都被清除,则ZF会被置为1,因为不满足LOOPNZ的条件,所以不会接着执行循环,会跳出循环向下执行,因为也不满足下一条语句jnz的条件,所以不会跳转到quit标号。接着往下执行,因为之前 esi 被前移了一个元素,所以此时将 esi 减去一个元素,即得到刚刚检测到的正数的地址值。
所有程序完成。
分享到:
相关推荐
3. **计算与表达式求值**:汇编语言可以处理各种算术和逻辑运算,如加、减、乘、除、位操作等。表达式的值可以通过一系列操作指令来计算。 4. **找最大、最小数**:通过比较指令(如CMP)和跳转指令(如JG, JL),...
根据提供的文件信息,我们可以深入分析其中涉及的汇编语言中的循环程序设计概念和技术要点。 ### 汇编循环程序设计 #### 循环程序设计基础知识 在计算机编程中,循环是一种常用的控制结构,用于重复执行一段代码...
在51单片机中,汇编语言编程涉及对片内RAM、寄存器等资源的操作。 【1. 数据位操作】 题目1展示了如何将一个字节的高四位与低四位进行交换。`SWAP A`指令用于交换累加器A中的高低四位。同时,通过`ANL A,#0FH`可以...
例如,将数组分为正数和负数数组,需要遍历整个数组,根据元素的正负性将其放入相应的数组中。 #### 寄存器使用和子程序设计 合理利用寄存器可以提高程序效率。子程序的设计则体现了模块化编程的思想,使得代码更...
4. BUFFER DB 01H,0AH在汇编语言中被称为(变量),因为它用来存储数据。 5. 在串操作指令中,源串操作数的段地址一般在(DS)存放器中。DS段寄存器通常用于指向数据段。 6. 使计算机执行某种操作的命令是(指令...
1. **链接程序**:在编程中,汇编程序负责将汇编语言编写的源代码转换成机器语言,而**连接程序**的作用是将编译后的目标模块与库文件合并,生成可以直接执行的可执行文件。选项B正确。 2. **指令指针与代码段**:...
3. **最大负数的查找**:编程时,我们需要遍历数组M,比较每个元素的值,找出最小的负数。由于我们要找的是最大负数的绝对值,因此实际上是在找最小的负整数。 4. **绝对值计算**:在计算机编程中,获取一个数的...
汇编语言中,数值的表示和运算需考虑其格式和位宽。 2. **标志寄存器与控制标志**:标志寄存器中,DF(Direction Flag), IF(Interrupt Flag), TF(Trap Flag)是控制标志,用于控制程序的执行流程。例如,DF控制...
- 统计8位或16位数中正数或负数的数量,同样需要遍历数组,检查每一位以判断数的符号。正数个数可以通过检查最高位(符号位)是否为0来计算,负数个数则检查是否为1。 8. **数据块比较** - 比较两个内存区域的...
9. **顺序表的折半查找**:折半查找是一种在有序数组中查找元素的高效方法。第9题中,查找不存在的元素,最多比较次数为log2(n)+1次,对于16个元素,最多比较6次。 10. **快速排序的递归次数**:快速排序的递归次数...
- 当数组中存在大量正数和少量负数时,贪心策略可能会更加高效。 - 动态规划可以用来解决更一般的情况,但可能需要较大的空间开销。 #### P1019 单词接龙 **所属知识点:** - 字符串处理技术(如字符串匹配、字符串...
7. **二分查找算法**:折半查找是一种在有序数组中查找特定元素的算法,它每次比较中间元素,根据比较结果决定搜索范围。A选项不能构成有效的二分查找序列,因为元素不是有序的。 8. **KMP算法**:KMP算法是一种...
18. **汇编语言程序员关注的存储器**:程序员关心的是地址映射、内存访问速度以及如何优化代码以利用缓存。 以上就是从这些题目中抽取的计算机科学相关知识点,它们涉及到数据结构、算法、操作系统、计算机组成原理...
### 微机原理与接口复习...这个示例演示了如何遍历数组并统计正数、负数的数量。 以上内容涵盖了8086/8088 CPU 的基本结构、寻址方式、I/O接口控制以及汇编语言编程的基础知识,对于理解微机原理与接口技术至关重要。
尖括号告诉编译器到系统的标准路径去找这个头文件,而双引号则让编译器先在当前目录中查找,找不到再去标准路径查找。例如,通常用于包含标准输入输出函数声明,而"test.h"则可能是自定义的头文件。 2. C语言编译...
在C编程语言中,`strcmp`函数是字符串比较的一个核心工具。这个函数广泛用于文本处理、数据比较和文件操作等场景。在这个“strcmp函数应用”的资料包中,我们可以看到几个关键元素,包括一个`.exe`可执行文件,一个`...