串操作指令一
- 格式:ppt
- 大小:281.00 KB
- 文档页数:13
串操作指令的使用一、串操作指令概述所谓串就是内存中一段地址相连的字节或字。
串操作就是对串中各项数据进行某种运算,也叫数据块操作。
8086/8088有5种基本串操作:⏹MOVS(Move string)串传送指令⏹CMPS(Compare string)串比较指令⏹SCAS(Scan string)串扫描指令⏹LODS(Load from string)从串取指令⏹STOS (Store in to string)存入串指令可以使用3种重复前缀:⏹REP(Repeat)无条件重复⏹REPE/REPZ(Repeat while equal/zero)相等/为零则重复⏹REPNE/REPNZ(Repeat while not equal/not zero)不相等/不为零则重复二、串操作指令详解★MOVS 串传送格式:MOVS dest,srcMOVSB(字节传送)MOVSW(字传送)功能:把DS:SI所指向的内存单元中的一个字或字节的内容取出复制到ES:DI所指向的字或字节内存单元中。
同时SI±1、DI±1或SI±2、DI±2,方向标志DF=1进行加运算,DF=0进行减运算;字节传送加减1,字传送加减2。
说明:☆单条MOV指令不能完成存储单元之间的数据传送;MOVS指令就是为解决内存储单元之间数据传送而设置的。
☆所涉及到的源内存单元和目的内存单元的地址分别存放在DS:SI和ES:DI中。
✧MOVS串传送指令不影响标志寄存器。
★LODS 从串取指令格式:LODS srcLODSB (取字节)LODSW(取字)功能:把DS:SI所指向的内存单元中的字或字节内容传送到AX或AL寄存器中。
同时SI 加减1或2;方向标志DF=1进行加运算,DF=0进行减运算;字节传送加减1,字传送加减2。
说明:☆LODS指令可用于取出指定的内存单元中的内容。
✧默认目的寄存器为AX或AL寄存器。
汇编-串操作指令串传输指令基础知识简介1. 系统标志寄存器EFLAGSDF: ⽅向标志位。
在串处理指令中,控制每次操作后si, di的增减DF=0 每次操作后si,di递增DF=1 每次操作后si,di递减2. std指令功能将系统标志寄存器EFLAGS中的DF(⽅向标志)置为1,即 DF=13. cld指令功能将系统标志寄存器EFLAGS中的DF(⽅向标志)置为0,即 DF=04. movs:串传送指令语法格式:movsb、movsw说明:(1)将DS:[SI]的内容传送到ES:[DI](2)若DF=0,则DI增加1,2、4。
否则DI减少1,2、45. stos:串存储指令语法格式:stosb、stosw、stosd说明:(1)将AL\AX\EAX寄存器的值复制到ES:DI所指的内存单元(2)若DF=0,则DI增加1,2、4。
否则DI减少1,2、46. scas:串扫描指令语法格式:scasb、scasw说明:(1)将ES:[DI]所指向的内容与AL/AX/EAX(字节/字/双字)进⾏⽐较,并依据所得到的差值来设置相关标志位。
受影响的标志位: AF,CF,OF,PF,SF,ZF(2)若DF=0,则DI增加1,2、4。
否则DI减少1,2、47. rep:重复前缀指令rep指令重复其后指定的字符串操作指令,重复的次数由计数寄存器cx来决定8. 使⽤串相关指令的⽅法:(1)传送的原始位置:ds:si(2)传送的⽬的位置:es:di(3)传送的⽅向:DF(4)传送长度:cx9. 算数和逻辑操作地址10. ⽰例如下:(1)#define copy_page(from,to) \__asm__("cld ; rep ; movsl"::"S" (from),"D" (to),"c" (1024)) // 从from处复制1页内存到to处(4K字节)(2)unsigned long get_free_page(void){register unsigned long __res asm("ax");__asm__("std ; repne ; scasb\n\t" // 置⽅向位,al(0)与对应每个页⾯的(di)内容⽐较"jne 1f\n\t" // 如果没有等于0的字节,则跳转结束(返回0)."movb $1,1(%%edi)\n\t" // 1 => [1+edi],将对应页⾯内存映像bit位置1."sall $12,%%ecx\n\t" // 页⾯数*4k = 相对页⾯其实地址"addl %2,%%ecx\n\t" // 再加上低端内存地址,得页⾯实际物理起始地址"movl %%ecx,%%edx\n\t" // 将页⾯实际其实地址->edx寄存器。