最近在学习 16位汇编编程,所以顺便将每日所学记录下来,一方面为了巩固学习的知识,另一方面也为同样在学习汇编开发的童鞋们提供一份参考。
运行环境:
- 操作系统: Windows 10家庭版
- 编译器:Windows XP Debug
串指令
串操作指令是8086系统中比较独特的一类指令,采用比较特殊的数据串寻址方式,在操作主存连续区域的数据时,特别好用;
重点掌握:MOVS STOS LODS CMPS SCAS REP
一般了解:REPZ ERPE ERPNZ REPNE
串数据类型
- 串操作指令的操作数是主存中连续存放的数据串(String),即在连续的主存区域中,字节或字的序列
- 串操作指令的操作对象是以字(WORD)为单位的字串,或是以字节(BYTE)为单位的字节串
串寻址方式
- 源操作数用寄存器SI寻址,默认在数据段DS中,但允许段超越;(DS:[SI])
- 目的操作数用寄存器DI寻址,默认在附加段ES中,不允许段超越;
- 每执行一次串操作指令,SI和DI将自动修改
- 执行指令CLD指令后,DF = 0,地址指针增1或2
- 执行指令STD指令后,DF = 1,地址指针减1或2
串传送
MOVS
把字节或字操作数从主存的源地址传送至目的地址
1 | MOVSB |
demo:
1 | 0B26:0100 FC CLD |
串存储
STOS
将AL或AX数据传送到目的地址
1 | STOSB |
demo:
1 | 0B26:0100 FD STD |
串读取
LODS
把指定贮存单元的数据传送给AL或AX
1 | LODSB |
demo:
1 | 0B26:0100 FC CLD |
串比较
CMPS
将主存中的源操作数减去至目的操作数,以便设置标志,进而比较两操作数之间的关系
1 | CMPSB |
demo:
1 | 0B26:0100 FC CLD |
如果在debug中做实现需要使用e指令来修改内存
串扫描
SCAS
将AL/AX减去至目的操作数,以便设置标志,进而比较AL/AX与操作数之间的关系
1 | SCASB |
demo:
1 | 0B26:0100 FC CLD |
重复前缀指令
repert
- 串操作指令执行一次,仅对数据串中的一个字节或字量进行操作。但是串操作指令前,都可以加一个重复前缀,实现串操作的重复执行。重复次数隐含中CX寄存器中;
- 重复前缀分两类,三条指令
- 配置不影响标志的MOVS、STOS(和LODS)指令的REP前缀
- 配合影响标志的CMPS和SCAS指令的REPZ和REPNZ前缀
简单理解即为:当数据串没用结束(CX!=0),则继续传送
repz
- 每执行一次串指令,CX减1
- 并判断ZF是否为0
- 只要CX=0或ZF=0,重复执行操作
REPZ和REPE前缀可以理解为:当数据串没有结束(CX!=0),并且串相等(ZF=1),则继续比较
1 | 0B26:0100 FC CLD |
REPNZ
- 每执行一次串指令,CX减1
- 并判断ZF是否为1
- 只要CX=0或ZF=1,重复执行操作
REPNZ和REPNE前缀可以理解为:当数据串没有结束(CX!=0),并且串相等(ZF=0),则继续比较
1 | 0B26:0101 BE0020 MOV SI,2000 |