《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 减去一个元素,即得到刚刚检测到的正数的地址值。
所有程序完成。
分享到:
相关推荐
找了好多地方没有找到,自己写一个汇编语言实现的数组排序。
用汇编语言编写 实现数组中元素的分类。需在代码中设置数据内容
汇编语言向数组中插入一个元素的源程序,在DOS下实现
求一个长为N(小于255)的ARRAY字数组中正数、负数与零的个数,正数的个数存放在DH中,负数的个数存放在DL中,零的个数存放在BH中。(扩展:将统计的结果显示出来)
汇编键盘输入20个数,将其放在三个数组中,输入的一个,正数一个,负数一个。正数求和输出,负数求个数。
易语言汇编取数组成员数源码,汇编取数组成员数,取数组成员数_
汇编语言写找出数组中最小的数,虽然简单,但可以给初学者提供思路
用汇编语言实现统计一个数组中正数负数零的个数。汇编代码
这是IBM-PC汇编语言程序设计中的一个小题6-15,R<——x+y-3,也许还有不足,大家可以共同研究
5.6 编写程序,将一个包含有20个数据的数组M分成两个数组:正数数组P和负数数组N,并分别把这两个数组中的数据的个数显示出来。 5.7 试编制一个汇编语言程序,求出首地址为DATA的100D字数组中的最小偶数,并把它放在...
(1)定义一个数组,并输出此数组 (2)在数组中检索一个数据 (3)数组中有此数据则删除此数据并输出新的数组
易语言源码易语言汇编读写数组源码.rar
易语言源码易语言汇编取数组成员数源码.rar 易语言源码易语言汇编取数组成员数源码.rar 易语言源码易语言汇编取数组成员数源码.rar 易语言源码易语言汇编取数组成员数源码.rar 易语言源码易语言汇编取数组成员数...
汇编语言求排序程序 汇编语言求排序程序 汇编语言求排序程序 汇编语言求排序程序 汇编语言求排序程序 汇编语言求排序程序 汇编语言求排序程序 汇编语言求排序程序
简单汇编程序代码,查找最小的偶数,并将该最小偶数进行输出,偶数可包括负数范围
汇编程序 求数组元素的最大值和最小值汇编程序 求数组元素的最大值和最小值汇编程序 求数组元素的最大值和最小值
C语言中数组指针在汇编语言寻址方式中的应用.pdf
Windows环境下32位汇编语言程序设计随书源代码(全) Windows环境下32位汇编语言程序设计随书源代码(全) Windows环境下32位汇编语言程序设计随书源代码(全) Windows环境下32位汇编语言程序设计随书源代码(全)
汇编_neon内嵌汇编实现数组相加