串操作指令
串操作指令特点
- 源串(源操作数)的偏移地址是DS:SI, 允许段重设
- 目标串(目标操作数)的偏移地址是ES:DI, 不允许段重设
- 串的长度值放在CX寄存器中
- 串操作指令本身可实现地址指针的自动修改, 修改方向与DF的状态有关, DF = 1按减地址(从高地址向减地址),DF = 0按增地址(从低地址向高地址),对字节(8位)操作加1, 对字(16位)操作加2
- 可以在串操作指令前加重复前缀,
若使用了重复前缀, CX寄存器的值会自动减1
源串: DS/SEGMENT:SI
目标串: ES:DI
重复次数: CX
操作方向: DF
指令 | 作用 |
---|---|
MOVSB | DS:[SI] -> ES:[DI] 1次8位 |
MOVSW | DS:[SI] -> ES:[DI] 1次16位 |
CMPSB | DS:[SI] - ES:[DI] (改变状态标志位) 1次8位 |
CMPSW | DS:[SI] - ES:[DI] (改变状态标志位) 1次16位 |
SCASB | AL - ES:[DI] |
SCASW | AX - ES:[DI] |
LODSB | DS:[SI] -> AL, SI + 1 或 SI - 1 |
LODSW | DS:[SI] -> AX, SI + 1 或 SI - 1 |
STOSB | AL -> ES:[DI], DI + 1 或 DI - 1 |
STOSW | AL -> ES:[DI], DI + 1 或 DI - 1 |
1. 串操作指令重复操作前缀
前缀 | 名称 | 重复条件 | 停止条件 |
---|---|---|---|
REP | 无条件重复前缀 | CX ≠ 0 | CX = 0 |
REPE / REPZ | 有条件重复前缀 | CX ≠ 0, 且ZF = 1 | - |
REPNE / REPNZ | 有条件重复前缀 | CX ≠ 0, 且ZF = 0 | - |
直到CX = 0或满足指定条件, 重复操作才停下来
(1). 无条件重复前缀
REP
重复执行指令规定的操作, 直到CX = 0
(2). 有条件重复前缀
REPE
REPZ
CX ≠ 0, 且ZF = 1时重复
(3). 有条件重复前缀
REPNE
REPNZ
CX ≠ 0, 且ZF = 0时重复
2. 串传送指令
MOVS BYTE/WORD PTR [DI], BYTE/WORD PTR [SI]
功能:
将SEGMENT:[SI] 对应的指定字长的数据复制到 ES:[DI] 对应的单元中
MOVSB
功能:
将DS:[SI] 对应的1
个单元的数据复制到 ES:[DI] 对应的单元中
MOVSW
功能:
将DS:[SI] 对应的2
个单元的数据复制到 ES:[DI] 对应的单元中
3. 串比较指令
CMPS BYTE/WORD PTR [DI], BYTE/WORD PTR [SI]
功能:
将SEGMENT:[SI] 单元指定字长的数据 与 ES:[DI] 对应的单元中的数据比较, 结果反映在状态标志位
CMPSB
功能:
将DS:[SI] 对应的1
个单元的数据 与 ES:[DI] 对应的单元中的1
个数据比较, 结果反映在状态标志位
CMPSW
功能:
将DS:[SI] 对应的2
个单元的数据 与 ES:[DI] 对应的单元中的2
个数据比较, 结果反映在状态标志位
串比较指令常与条件重复前缀REPZ(REPZ)或REPNE(REPNZ)连用, 加重复前缀的情况下吗串比较指令结束有两种可能:
- 不满足条件前缀所要求的条件
- CX = 0
串比较指令会影响 ZF 的状态
重复前缀 | 重复条件 |
---|---|
REPZ(REPZ) | ZF = 1 |
REPNE(REPNZ) | ZF = 0 |
4. 串扫描指令
SCAS OPRD
功能:
OPRD是目标串, 用AL或AX的值与目标串(由ES:DI指定)中的字节或字比较, 结果影响状态标志位, 当不相等时, ZF = 0
SCASB
一次比较8位(1字节)
SCASW
一次比较16位(2字节)
5. 串装入指令
LODS OPRD
功能:
OPRD是源串, 由DS:[SI]所指向的源串中的字节或字, 取到AL或AX, 并在之后, DF的值自动修改指针SI
LODSB
一次装载8位(1字节)
LODSW
一次装载16位(2字节)
6. 串存储指令
STOS OPRD
功能:
OPRD是目标串, 把AL或AX中的数据存储到ES:DI指向的存储单元中, 并在此之后, DF的值会自动修改DI的值
STOSB
一次存储8位(1字节)
STOSW
一次存储16位(2字节)