![]() | 第5章 子程序和串处理 | -109- | |||||||||||||||||||
exit: main code |
mov int pop loop mov int mov int inc jmp mov int endp ends end |
ah,0eh 10h ax outloop ax,0e0dh 10h al,0ah 10h di next_char ah,4ch 21h main |
;利用10H中断的0EH功能 ;输出AL寄存器中的字符 ;取回AX寄存器 ;处理下一个数位 ;输出回车符 ;输出换行符 ;DI寄存器指向下一个字符 ;转NEXT_CHAR继续搜索待查串的首字符 ;结束程序 |
||||||||||||||||||
在这个程序我们又新增了两条指令--CMPS和JCXZ: | |||||||||||||||||||||
![]() |
助记符:CMPS(Compare string) 用 途:比较两个数据串 格 式:CMPSB(按字节比较) CMPSW(按字比较) 执 行:将位于DS:SI处的数据和位于ES:DI处的数据进行比较操作,并根据比较结果设定标志位,而后SI,DI两寄存器根据DF标志的状态相应增减。 |
||||||||||||||||||||
相信大家对指令末尾的字母"B"和"W"已经有所领悟,不再多说。这条指令的特点是直接对存储器中的数据进行操作,和SCAS指令一样,如果不加REP前缀,那么这个指令也只能对一对数据进行比较,不能比较整串数据。因此在程序中我们使用了REPZ,目的是在两字符相同的情况下继续比较下一个字符。可以想到如果两字符串完全相同,那么这种比较会导致两种后果--ZF=1且CX=0。我们完全可以用"JZ/JNZ"指令检测比较的结果,但在上面的程序中我们使用了一条新指令: | |||||||||||||||||||||
![]() |
助记符:JCXZ(Jump if cx is zero) 用 途:根据CX寄存器的情况进行转移 格 式:JCXZ 目的地址 执 行:判断CX寄存器情况,若CX=0则转移到目的地址处执行指令,否则继续执行下面的指令。 |
||||||||||||||||||||
从本质上讲"JCXZ"也是条件转移指令,但它的转移条件有些不寻常,并非受标志寄存器控制,而直接受控于CX寄存器。当然,既然是条件转移指令,它也只能是短程的。和JZ指令不同,它没有转移条件相反的指令,JCXNZ是不存在的。在上面的程序中将JCXZ指令换成JZ指令也是可以的,只不过是取了不同的转移条件罢了。 从思路上看这两个程序并无区别,但使用串处理指令的程序要比采用一般方法的程序简捷一些,主要是少了一些易混乱的转移指令。学到这里我们应该对串处理指令的特性有了明确的认识,"串处理"的核心主要在于这样一些硬件:累加器、计数器、DS:SI寄存器组合、 |
|||||||||||||||||||||
Copyright © 2004-2015 Reanimator | www.cookmoon.org |