目录 上一页 下一页 下一章

第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

目录 上一页 下一页 下一章