【汇编】串处理指令

一、串处理指令

(一)串传送指令 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 小时前
MYSQL学习笔记(九):MYSQL表的“增删改查”
数据库·笔记·后端·sql·学习·mysql·考研
yuanbenshidiaos3 小时前
【数据挖掘】数据仓库
数据仓库·笔记·数据挖掘
sealaugh324 小时前
aws(学习笔记第二十九课) aws cloudfront hands on
笔记·学习·aws
FakeOccupational5 小时前
【计算社会学】 多智能体建模 ABM Agent Based Modeling 笔记
笔记
夏莉莉iy5 小时前
[MDM 2024]Spatial-Temporal Large Language Model for Traffic Prediction
人工智能·笔记·深度学习·机器学习·语言模型·自然语言处理·transformer
StickToForever5 小时前
第4章 信息系统架构(三)
经验分享·笔记·学习·职场和发展
零星_AagT6 小时前
Apache-CC6链审计笔记
java·笔记·apache·代码审计
宇寒风暖8 小时前
侯捷 C++ 课程学习笔记:内存管理与工具应用
c++·笔记·学习
云缘若仙8 小时前
directx12 3d+vs2022游戏开发第六章 笔记十一
笔记·directx12 3d
电棍2339 小时前
在wsl环境中配置和开发verilog(一种比较新颖的verilog开发指南)
笔记