-114- | PC机汇编语言实战精解 | ![]() |
|||||||||||||||||||
要注意,这个指令实际执行一种"COPY"的操作,数据串移动到另一个位置后,原位置的数据依然存在,这可以从上面程序的输出结果上看出来。 通过这么多实际问题我们可以看出,很多串处理指令只有和REP前缀联合应用才能真正处理数据串,单独应用的串指令目前只有一个--LODS。其实LODS也可以加上REP前缀,只是我还没有发现这样应用LODS指令有什么实用价值。我曾在程序中写出过REP PUSH AX这样的指令,竟然也能编译通过,不过用DEBUG跟踪执行这样的指令时并未发生想象中的所谓"连续压栈"所操作,大家可以试一下,看看究竟会发生什么。 问题已经讨论完了,但串处理指令还有一个没有说到,笔者特意将此指令保留到最后,目的是想借着讨论这个指令之机为即将开始的新一章打一个伏笔。这最后一个串指令就是和LODS相对的指令--STOS: |
|||||||||||||||||||||
![]() |
助记符:STOS(Store in to string) 用 途:成串存入数据 格 式:STOSB(存入一字节) STOSW(存入一个字) 执 行:将累加器中的数据存入ES:DI指向的内存单元,同时DI寄存器根据DF的状态相应增减。 |
||||||||||||||||||||
例程DISPSTR.ASM序说明这个指令的用法: DISPSTR.ASM |
|||||||||||||||||||||
data string data code main disploop: |
segment assume db'The sa ends segment assume proc mov mov mov mov mov mov mov cld rep mov mov mov lodsb or jz stosw |
ds:data me sunshine is presente cs:code far ax,data ds,ax ax,0b800h es,ax di,0 ax,0720h cx,2048 stosw si,offset string di,160*10+16 ah,2 al,al exit |
d to all those who love sunshine',0 ;初始化DS寄存器 ;ES寄存器置入段地址0B800H ;DI寄存器清0 ;AX寄存器置入0720H ;处理2048个字 ;设置DF标志 ;将0720H写入ES:DI指向的内存单元 ;SI寄存器指向字符串STRING ;设置DI寄存器 ;AH寄存器送入2 ;取得一个字符 ;是0吗? ;是0,结束程序 ;将字符连同AH中的02H一同写入内存 |
||||||||||||||||||
Copyright © 2004-2015 Reanimator | www.cookmoon.org |