【汇编】串处理指令

一、串处理指令

(一)串传送指令 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

补充理解


参考文章

串操作指令

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

相关推荐
墨染枫25 分钟前
pytorch学习笔记-使用DataLoader加载固有Datasets(CIFAR10),使用tensorboard进行可视化
pytorch·笔记·学习
jarreyer1 小时前
【图像分割】记录1:unet, yolov8_seg
人工智能·笔记·计算机视觉
ljt27249606612 小时前
Compose笔记(三十八)--CompositionLocal
笔记·android jetpack
月阳羊9 小时前
【硬件-笔试面试题】硬件/电子工程师,笔试面试题-26,(知识点:硬件电路的调试方法:信号追踪,替换,分段调试)
笔记·嵌入式硬件·面试·职场和发展
南玖yy10 小时前
Linux 桌面市场份额突破 5%:开源生态的里程碑与未来启示
linux·运维·服务器·汇编·科技·开源·gradle
Star在努力10 小时前
14-C语言:第14天笔记
c语言·笔记·算法
霜绛11 小时前
机器学习笔记(三)——决策树、随机森林
人工智能·笔记·学习·决策树·随机森林·机器学习
charlie11451419115 小时前
快速入门Socket编程——封装一套便捷的Socket编程——导论
linux·网络·笔记·面试·网络编程·socket
xiaoli232716 小时前
课题学习笔记2——中华心法问答系统
笔记·学习
就改了16 小时前
FastDFS如何提供HTTP访问电子影像文件
笔记