有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
------------------------------------------------------
- [somniumchase] 我一运行就说没有数字 01/01 11:44
- [游客] 为什么啊 08/07 15:36
- [游客] 如果想快一些 就改下面这里 dx值改成1H delay: push ax 04/19 02:53
- [lshhjx] 注释在程序中很重要,楼主不知道吗? 12/08 13:40
- [biaggi] 看不明白,在下還須學習 11/06 08:11
- [游客] 我运行的时候直接显示Unkown filename跳出了- -请问怎么改 06/16 21:44
- [游客] 勿庸置疑,注释是好习惯。与人方便自己方便。 04/12 10:33
- [游客] 老实说,看着真心累呀! 04/07 18:37
- [游客] 很无语,初学者就多看书,不要动不动要别人注释,基础打好了,再自己注释,这样比别人帮你注释好得多 12/17 19:43
- [dgkepu] 初学者:不懂,希望有多点注释带着学习学习! 12/07 20:52
- [游客] windows 7是一个64Bit操作系统,它不兼容DOS,无法识别16Bit系统。重装系统wind 02/28 21:05
- [游客] windows 7是一个64Bit操作系统,它不兼容DOS,无法识别16Bit系统。重装系统wind 02/28 21:05
- [466987333] 你好,高手,我想请教一个问题。 我用的是win7操作系统,32位的,里面没有找masm目录,是不是 12/12 17:30
- [lanfioncc] 那个太高级了。。。我还有点看不懂。。不过谢谢!!! 11/27 11:23
- [yc2010] 实验16中的 table: dw sub1,sub2,sub3,sub4 可不可以改成呢? 09/11 09:08
- [yc2010] mov bl,ah mov bh,0 add bx,bx ----------->这里为 09/07 21:03
- [yc2010] 为什么要add bx,bx呢? 09/07 20:55
- [yc2010] 那是不是像table[bx],ds[bx]....等(内存单元)都是表示一个字节呢? 09/06 21:10
- [masmaster] 杨季文的《80X86汇编语言程序设计教程》 09/01 12:52
- [游客] to masmaster shl左移4位,那al传进来的4,5,6位背景色不就没了. 为什 09/01 11:00
[2010-07-16 17:44] 串操作指令:lods/stos/movs/ins/outs/scas/cmps
评论次数(0) |
浏览次数(913) |
类型(汇编语言笔记) |
收藏此文 |