【汇编】串处理指令

一、串处理指令

(一)串传送指令 MOVS

  • 格式

    • MOVS DST,SRC
    • MOVSB(字节)
    • MOVSW(字)

    其中第二、三种格式明确地注明是传送字节或字,第一种格式则应在操作数中表明是字还是字节操作,例如:MOVS ES:BYTE PTR[DI],DS:[SI]

  • 执行的操作((DI)) ← ((SI))

    字节操作(SI) ← (SI)±1(DI) ← (DI)±1

    字操作(SI) ← (SI)±2(DI) ← (DI)±2

    :方向标志 DF=0 时用 +DF=1 时用 -

  • 标志位:不影响

(二)存入串指令 STOS

  • 格式

    • STOS DST,SRC
    • STOSB(字节)
    • STOSW(字)
  • 执行的操作

    字节操作((DI)) ← (AL)(DI) ← (DI)±1

    字操作((DI)) ← (AX) (DI) ← (DI)±2

    该指令把AL或AX的内容存入由(DI)指定的附加段的某单元中,并根据 DF 的值及数据类型修改 DI 的内容,当它与 REP 联用时,可把 AL 或 AX 的内容存入一个长度为(CX)的缓冲区中

  • 标志位:不影响

(三)串取指令 LODS

  • 格式

    • LODS SRC
    • LODSB(字节)
    • LODSW(字)
  • 执行的操作

    字节操作(AL) ← ((SI))(SI) ← (SI)±1

    字操作(AX) ← ((SI))(SI) ← (SI)±2

    **该指令把由(SI)指定的数据段中某单元的内容送到AL或AX中,**并根据方向标志及数据类型修改 SI 的内容

  • 标志位:不影响

注意

  • LODS 指令一般不和 REP 联用
  • 源串一般在数据段中(允许使用段跨越前缀来修改),目的串必须在附加段中

(四)比较指令 CMPS

  • 格式

    • CMPSB(字节)
    • CMPSW(字)
  • 执行的操作((SI)) ← ((DI))

    字节操作(SI) ← (SI)±1(DI) ← (DI)±1

    字操作(SI) ← (SI)±2(DI) ← (DI)±2

    指令把由(SI)指向的数据段中的一个字(或字节)与由(DI)指向的附加段中的一个字(或字节)相减,但不保存结果,只根据结果设置条件码,指令的其他特性和MOVS 指令的规定相同

  • 标志位:影响条件标志 (同 CMP)

(五)串扫描指令 SCAS

  • 格式

    • SCAS DST
    • SCASB(字节)
    • SCASW(字)
  • 执行的操作

    字节操作(AL) ← ((DI))(DI) ← (DI)±1

    字操作(AX) ← ((DI))(DI) ← (DI)±2

    该指令把AL(或AX)的内容与由(DI)指定的在附加段中的一个字节(或字)进行比较,并不保存结果,只根据结果置条件码。指令的其他特性和MOVS 的规定相同

  • 标志位:影响条件标志 (同 CMP)


以上串操作指令具有下列共性

  1. DS:SI 指向源串,ES:DI 指向目的串
  2. SI 和 DI 自动增加或者减少1,2,4,关键要看 DF 的值以及操作类型是字节、字、双字,若DF=0,则SI和DI增加,否则减少

二、串重复前缀

当以上5种串操作指令与重复前缀 REP,REPZ\REPE,REPNZ\REPNE 结合使用时,可以处理整个数据串

重复前缀分2类,3条指令:

  1. 配合不影响标志的 MOVS\STOS\LODS 指令的 REP 前缀
  2. 配合影响标志的 CMPS\SCAS 指令的 REPZ\REPNA 前缀

(一)重复前缀 REP

  • 格式REP String_Primitive

    其中 String_Primitive 可为 MOVSLODSSTOS 指令

  • 执行的操作

    1. (CX)=0则退出REP ,否则往下执行
    2. (CX) ← (CX)-1
    3. 执行其中的串操作
    4. 重复 1~3

    功能:使其后的一条串指令重复执行 CX 次,若 CX 的初值为0,则不执行任何操作

设置方向标志指令

  • CLD(Clear direction flag),该指令使 DF=0,在执行串操作指令时可使地址自动增量
  • STD(Set direction flag),该指令使 DF=1,在执行串操作指令时可使地址自动减量

举例REP MOVS BYTE PTR[DI],BYTE PTR[SI]

上面指令将 [SI] 中的值拷贝到 [DI] 位置,然后 DI 和 SI 同方向增加或者减少一个字节(由DF值决定),直到 ECX 中的值为 0

(二)有条件重复前缀

(1)相等/为零重复串操作 REPE / REPZ

  • 格式REPE(或REPZ) String_Primitive
    其中 String_Primitive 可为CMPSSCAS 指令
  • 执行的操作
    1. (CX)=0ZF=0(即某次比较的结果两个操作数不等)时退出,否则往下执行
    2. (CX) ← (CX)-1
    3. 执行其中的串操作
    4. 重复 1~3

(2)不等/非零重复串操作 REPNE / REPNZ

  • 格式REPNE(或REPNZ) String_Primitive
    其中 String_Primitive 可为CMPSSCAS 指令
  • 执行的操作
    1. (CX)=0ZF=1(即某次比较的结果两个操作数相等)时退出,否则往下执行
    2. (CX) ← (CX)-1
    3. 执行其中的串操作
    4. 重复 1~3

补充理解


参考文章

串操作指令

汇编语言------串操作指令

相关推荐
大筒木老辈子2 小时前
Linux笔记---进程:进程替换
linux·服务器·笔记
不会聊天真君6473 小时前
爬虫(JAVA笔记第四十期)
java·笔记
吃着火锅x唱着歌4 小时前
PHP7内核剖析 学习笔记 第一章 PHP基础架构
笔记·学习·php
亦枫Leonlew7 小时前
三维测量与建模笔记 - 5.3 光束法平差(Bundle Adjustment)
笔记·计算机视觉·三维重建·光束法平差
Lbs_gemini06038 小时前
C++研发笔记14——C语言程序设计初阶学习笔记12
c语言·开发语言·c++·笔记·学习
MarisolHu9 小时前
前端学习笔记-Vue篇-02
前端·vue.js·笔记·学习
先知demons10 小时前
uniapp开发微信小程序笔记10-触底加载
前端·笔记·微信小程序·小程序·uni-app
B1nna10 小时前
外卖开发(三)开发笔记——AOP实现实现公共字段填充、主键回显、抛异常和事务管理
笔记
我的老子姓彭10 小时前
C++学习笔记
c++·笔记·学习
m0_6896182812 小时前
亚毫米级纤维机器人,如何在腔内“大显身手”
网络·笔记·机器人