http://www.cnblogs.com/JCSU/articles/2137802.html
一、字符串处理指令
(1) lodsb、lodsw:把DS:SI指向的存储单元中的数据装入AL或AX,然后根据DF标志增减SI(CLD递增, STD递减)
(2) stosb、stosw:把AL或AX中的数据装入ES:DI指向的存储单元,然后根据DF标志增减DI(CLD递增, STD递减)
(3) movsb、movsw:把DS:SI指向的存储单元中的数据装入ES:DI指向的存储单元中,然后根据DF标志分别增减SI和DI
(4) scasb、scasw:把AL或AX中的数据与ES:DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI
(5) cmpsb、cmpsw:把DS:SI指向的存储单元中的数据与ES:DI指向的存储单元中的数据相减,影响标志位,然后根据DF标志分别增减SI和DI
(6) rep:重复其后的串操作指令。重复前先判断CX是否为0,为0就结束重复,否则CX减1,重复其后的串操作指令。
主要用在MOVS和STOS前。一般不用在LODS前。
上述指令涉及的寄存器:段寄存器DS和ES、变址寄存器SI和DI、累加器AX、计数器CX
涉及的标志位:DF、AF、CF、OF、PF、SF、ZF
搬移字串指令有两种,分别是 MOVSB 和 MOVSW,先说 MOVSB。MOVSB 的英文是 move string byte,意思是搬移一个字节,它是把 DS:SI 所指地址的一个字节搬移到 ES:DI 所指的地址上,搬移后原来的内容不变,但是原来 ES:DI 所指的内容会被覆盖而且在搬移之后SI 和 DI 会自动地址向下一个要搬移的地址。
一般而言,通常程序设计师一般并不会只搬一个字节,通常都会重复许多次,如果要重复的话,就得把重复次数 ( 也就是字串长度 ) 先记录在 CX 寄存器,并且在 MOVSB 之前加上 REP 指令,REP 是重复 (repeat) 的意思。这种写法很是奇怪,一般而言汇编语言源文件的每一行都只有一个指令,但 REP MOVSB 却可以在同一行写两个指令,当然分开写也是一样的。
http://hi.baidu.com/elevin/blog/item/211ac0b4ffbb1d7a8bd4b2a4.html
1、操作指令功能
移动 movsb, movsw, movsd 从 ESI 指向的内存位置向 EDI 指向的内存位置拷贝数据
比较 cmpsb, cmpsw, cmpsd 把 ESI 指向内存位置的数据和 EDI 指向内存位置拷的数据比较(ESI,EDI都指向相匹配元素的后面的那个元素)
搜索 scasb, scasw, scasd 把 al/ax/eax 中的数据与 EDI 寻址的内存数据比较(EDI指向查找到的元素的后面的那个元素)
储存 stosb, stosw, stosd 把 al/ax/eax 中的数据保存在 EDI 寻址的内存单元
加载 lodsb, lodsw, lodsd 把 ESI 寻址的内存数据加载到 al/ax/eax 中
2、重复执行前缀
rep 当 ecx>0 时重复
repe, repz 当 ecx>0 ,且 ZF==1 时重复(只用在比较和搜索中)
repne,repnz 当 ecx>0 ,且 ZF==0 时重复(只用在比较和搜索中)
3、重复执行方向
cld 清除 DF 标志,ESI 和 EDI 递增
std 设置 DF 标志,ESI 和 EDI 递减
4、字符操作指令格式
方向 cld, std
数据来源 esi,al/ax/eax
数据目的 edi,al/ax/eax
循环次数 ecx
重复前缀 操作指令 rep, repe, repne movsb, cmpsb, scasb, stosb, lodsb
二、使用举例
(1) 把当前数据段中偏移1000H开始的100个字节的数据传送到从偏移2000H开始的单元中
CLD
PUSH DS
POP ES
MOV SI,1000H
MOV DI,2000H
MOV CX,100
NEXT: LODSB
STOSB
DEC CX
JNZ NEXT
============================================================
CLD
PUSH DS
POP ES
MOV SI,1000H
MOV DI,2000H
MOV CX,100
NEXT: MOVSB
DEC CX
JNZ NEXT
============================================================
CLD
PUSH DS
POP ES
MOV SI,1000H
MOV DI,2000H
MOV CX,3
NEXT: MOVSB
LOOP NEXT
============================================================
CLD
PUSH DS
POP ES
MOV SI,1000H
MOV DI,2000H
MOV CX,3
REP MOVSB
============================================================
(2) 判断AL中的数字是否为16进制数
STRING DB '0123456789ABCDEFabcdef'
STRLEN EQU $-STRING ; 注意这个用法
...
CLD
MOV DX,SEG STRING
MOV ES,DX
MOV CX,STRLEN
MOV DI,OFFSET STRING
NEXT: SCASB
LOOPNZ NEXT
JNZ NOT_FOUND
FOUND:
...
NOT_FOUND:
...
============================================================
(3) 其它实例
start:
mov ax,#BOOTSEG
mov ds,ax
mov ax,#INITSEG
mov es,ax
mov cx,#256
sub si,si
sub di,di
rep
movw
============================================================
movl $1024*5,%ecx
xorl %eax,%eax
xorl %edi,%edi
cld;rep;stosl
movl $pg0+7,_pg_dir
movl $pg1+7,_pg_dir+4
movl $pg2+7,_pg_dir+8
movl $pg3+7,_pg_dir+12
movl $pg3+4092,%edi
movl $0xfff007,%eax
std
1: stosl
subl $0x1000,%eax
jge 1b
============================================================