8086指令系统(四) 串操作指令

书读的越多而不加思考,你就会觉得你知道得很多;而当你读书而思考得越多的时候,你就会越清楚地看到,你知道得很少。

导读:本篇文章讲解 8086指令系统(四) 串操作指令,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

串操作指令

串操作指令特点
  1. 源串(源操作数)的偏移地址是DS:SI, 允许段重设
  2. 目标串(目标操作数)的偏移地址是ES:DI, 不允许段重设
  3. 串的长度值放在CX寄存器中
  4. 串操作指令本身可实现地址指针的自动修改, 修改方向与DF的状态有关, DF = 1按减地址(从高地址向减地址),DF = 0按增地址(从低地址向高地址),对字节(8位)操作加1, 对字(16位)操作加2
  5. 可以在串操作指令前加重复前缀, 若使用了重复前缀, 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)连用, 加重复前缀的情况下吗串比较指令结束有两种可能:

  1. 不满足条件前缀所要求的条件
  2. 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字节)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/122850.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!