目录 上一页 下一页 下一章

第5章 子程序和串处理 -105-










not_found:


exit:

main
code

rol
push
and
xlat
mov
int
pop
loop
jmp

mov
mov
int
mov
int
endp
ends
end
ax,1
ax
ax,000fh

ah,0eh
10h
ax
outloop
exit

dx,offset errmsg
ah,9
21h
ah,4ch
21h


main

;暂存AX寄存器
;保留AX寄存器的低4位
;取得对应的ASCII码
;利用10H中断的0EH功能
;显示AL寄存器中的字符
;取回AX寄存器
;处理下一个数位
;转至EXIT结束程序

;显示出错信息


;结束程序




  程序中新出现了一个寄存器--DI(Destination Index)。
  DI称为目的地址索引寄存器,它和SI寄存器一样用于保存串处理指令需要用到的地址,但这个寄存器指示的是"目的地址",也就是说它和LODS这样的指令没有任何关系。只有那些具有"写"数据操作的串指令或串扫描、串比较指令才会使用DI寄存器中的地址。
  当然DI寄存器也可以作间接寻址用,这和SI寄存器是一样的。还有一点需要注意的是在使用串处理指令时这个寄存器是和附加段寄存器ES相配合给出逻辑地址,只有在不用于串指令而作一般的间接寻址用时,才默认DS为段地址。
  回顾一下上面的程序,我们在设定DS寄存器指向DATA段后又用MOV ES,AX指令将ES寄存器设为DATA段,目的就在于为后面的SCAS指令建立正确的字符串地址。那么SCAS指令又具有什么作用呢?
助记符:SCAS(Scan string)
用 途:在"目的串"中搜索给定的数据
格 式:SCASB(搜索一字节)
    SCASW(搜索一个字)
执 行:将位于ES:DI处的数据(字节或字)与累加器中的数据进行比较,并根据结果设定标志位,同时DI寄存器根据DF标志变化。
  和LODS一样,指令末尾的"B"和"W"表示所要搜索的数据位宽,DI寄存器究竟变化1还是2就由这两个字母决定。不过这个指令有个易搞混的问题,就是单独使用这个指令时是否会将字符串中所有数据都处理一次?
  大家不要被它的名字蒙住,它虽然叫串扫描指令,但如果我们单独使用这个指令,它只会将ES:DI指向的数据与累加器相比,而后改变DI寄存器,并不像我们所想的那样将整个串中所

Copyright © 2004-2015 Reanimator www.cookmoon.org

目录 上一页 下一页 下一章