自学内容网 自学内容网

【汇编】串处理指令

一、串处理指令

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

补充理解

在这里插入图片描述


参考文章

串操作指令

汇编语言——串操作指令


原文地址:https://blog.csdn.net/m0_74209563/article/details/144158633

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!