汇编网首页登录博客注册
masmaster的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
文章收藏

[2010-07-16 17:44] 串操作指令:lods/stos/movs/ins/outs/scas/cmps

有5种串操作指令。每条串操作指令允许传送的数据可以是字节,字,双字,或者是重复传送的字节,字,双字 。在使用串操作指令前,必须设置好D标志位。
方向标志选择串操作期间变址寄存器SI和DI的自动增量或减量。此标志位只适用于串操作指令。
cld指令清零D位,即D=0;为自增方式。字符串传送方向由低地址向高地址传输。
std指令置1D位,即D=1;为自减方式。字符串传送方向由高地址向低地址传送。
如果串操作指令对字节操作, 那么si/di的内容±1。如果草操作指令对字操作, 那么si/di的内容±2。传送双字的话,si/di的内容±4。

si和di
串操作执行期间,对存储器的方位是通过si和di两者或者其中之一实现的。
用si做偏移地址的话,隐含的访问数据段DS中的数据;用di做偏移地址的话,隐含的访问的是附加段ES的数据。

lods
lods指令时将存储在数据段DS中用SI指示的偏移地址寻址的数据装入(load)al,ax或eax。用字节的话装入的是al,用字的话装入的是ax,用双字的话装入的是eax。
如果D=0,si的内容则增。如果D=1,si的内容自减。
如果lods是字节型,si±1;如果lods是字型,si±2;如果lods是双字,si±4。 lods指令格式如下:
-------------------------------------------------------
指令          功能
lodsb         al=ds:[si];si=si±1
lodsw         ax=ds:[si];si=si±2
lodsd         eax=ds:[si];si=si±4
lods buff     al=ds:[si];si=si±1  ;buff is byte data
lods buff1    ax=ds:[si];si=si±2  ;buff1 is word data
lods buff2    eax=ds:[si];si=si±4 ;buff2 is dword data
-------------------------------------------------------

stos
stos指令将al,ax,eax的数据存储到由DI寻址的附加段ES中。次指令类似lods,我感觉是lods的相反操作,类似push和pop一样。lods把内存中的数据load到寄存器,stos把寄存器中的数据store到内存中。lods隐含的变址寄存器是si,段寄存器是ds,而stos隐含的变址寄存器是di,段寄存器是es。
基本格式与lods也类似。如下:
-------------------------------------------------------
指令          功能
stosb         es:[di]=al;di=di±1
stosw         es:[di]=ax;di=di±2
stosd         es:[di]=eax;di=di±4
stos buff     es:[di]=al;di=di±1;buff is byte data
stos buff1    es:[di]=ax;di=di±2;buff1 is word data
stos buff2    es:[di]=eax;di=di±4;buff2 is dword data
-------------------------------------------------------

movs
movs,最实用的串操作指令之一。它可以把一个存贮单元的数据传送至另一个存贮单元。
movs指令从数据段ds内由si寻址的存贮单元的字节,字,或双字,传送到附加段es内由di寻址的存贮单元中。
在这里,总是用数据段DS和SI寻址源地址,附加段ES和DI寻址目的地址。
movs指令格式如下:
-------------------------------------------------------
指令         功能
movsb        es:[di]=ds:[si];si,di,±1
movsw        es:[di]=ds:[si];si,di,±2
movsd        es:[di]=ds:[si];si,di,±4
movs a1,a2   es:[di]=ds:[si];si,di,±1;a1,a2,bytedata
movs a3,a4   es:[di]=ds:[si];si,di,±2;a3,a4,worddata
movs a5,a6   es:[di]=ds:[si];si,di,±4;a5,a6,dworddata
-------------------------------------------------------

rep前缀
重复前缀rep可以加到除了lods指令以外的任何串操作指令上。
执行重复的lods操作没有任何意思。
rep前缀是的每次串操作以后cx减一。 如果cx=0,指令结束。

ins(不能用于8086cpu)
串输入指令,从i/o设备传送字节,字,双字数据到附加段ES由di寻址的存储单元。 i/o地址存放在dx中。 这条指令对于将外部设备的数据块直接输入到存储器很哟用。
类似其他串操作指令, ins也有3种基本格式:
-------------------------------------------------------
指令          功能
insb          es:[di]=[dx];di=di±1
insw          es:[di]=[dx];di=di±2
insd          es:[di]=[dx];di=di±4
ins a         es:[di]=[dx];di=di±1 ;a is byte
ins b         es:[di]=[dx];di=di±2 ;b is word
ins c         es:[di]=[dx];di=di±4 ;c is dword
-------------------------------------------------------
注意:[DX]指明还有I/O设备的地址。

outs(不能用于8086cpu)
串输出指令从si寻址的数据段DS存储单元传送字节,字,双字至i/o设备。指令格式类似ins,执行ins相反的操作
-------------------------------------------------------
指令          功能
outsb         [dx]=ds:[si];si=si±1
outsw         [dx]=ds:[si];si=si±2
outsd         [dx]=ds:[si];si=si±4
outs a        [dx]=ds:[si];si=si±1;a is byte
outs b        [dx]=ds:[si];si=si±2;b is word
outs c        [dx]=ds:[si];si=si±4;c is dword
-------------------------------------------------------
注意:[DX]指明dx含有i/o设备的地址。

再补充两个串指令:scas和cmps
scas,串扫描指令,指的是al,ax,eax分别和存储单元中字节内存块,字内存块,双字内存块进行比较,
sacs指令用al,ax,eax的内容减去相应存储块但是不会影响它们。
字节扫描用的操作码是scasb,字扫描用scasw,双字比较则用scasd。所有情况下,由DI寻址的附加段ES中的内容和al,ax,eax比较。缺省的ES段不能段超越。
与其他串指令一样, scas用方向标志D选择对于di的自增或者自减1。如果用条件重复前缀, 则scas指令重复。
例子:
------------------------------------------------------
cld ;D=0,增量扫描
mov cx,256
mov al,‘A’
repe scasb
------------------------------------------------------
cmps,串比较指令,它总是按字节cmpsb,字cmpsw,双字cmpsd比较两个内存单元的数据。数据段DS由SI寻址的内容与附加段ES由DI寻址的存储单元内容比较。cmps指令使si,di两者自增或者自减1,通常用repe或者repne作为重复前缀。
例子:
------------------------------------------------------
cld  ;D=0,增量
mov cx,256
mov si,offset a  ;存储单元a的偏移地址
mov di,offset b  ;存贮单元b的偏移地址
repe cmpsb
------------------------------------------------------
评论次数(0)  |  浏览次数(913)  |  类型(汇编语言笔记) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码