`
zzc1684
  • 浏览: 1229457 次
  • 性别: Icon_minigender_1
  • 来自: 广州
文章分类
社区版块
存档分类
最新评论

学 Win32 汇编[29] - 串指令: MOVS*、CMPS*、SCAS*、LODS*、REP、REPE、REPNE 等

 
阅读更多

这里的 "串" 并不单指字符串, 包括所有连续的数据(如数组); 串指令只用于内存操作.


 

移动串指令: MOVSBMOVSWMOVSD ;从 ESI -> EDI; 执行后, ESI 与 EDI 的地址移动相应的单位
比较串指令: CMPSBCMPSWCMPSD ;比较 ESI、EDI; 执行后, ESI 与 EDI 的地址移动相应的单位
扫描串指令: SCASBSCASWSCASD ;依据 AL/AX/EAX 中的数据扫描 EDI 指向的数据, 执行后 EDI 自动变化
储存串指令: STOSBSTOSWSTOSD ;将 AL/AX/EAX 中的数据储存到 EDI 给出的地址, 执行后 EDI 自动变化
载入串指令: LODSBLODSWLODSD ;将 ESI 指向的数据载入到 AL/AX/EAX, 执行后 ESI 自动变化

其中的 B、W、D 分别指 ByteWordDWord, 表示每次操作的数据的大小单位.

上述指令可以有重复前缀:
REP             ECX > 0REPE (或 REPZ)  ECX > 0 且 ZF=1REPNE(或 REPNZ) ECX > 0 且 ZF=0;重复前缀可以自动按单位(1、2、4)递减 ECX


MOVSB: 移动字符串


; Test29_1.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.data
    szSource db 'Delphi 2010', 0 
    len      equ $ - szSource - 1
    szDest   db len dup(?), 0
.code
main proc
    lea esi, szSource
    lea edi, szDest
    mov ecx, len
    cld ;复位标志寄存器的方向标志, 以让串地址由低到高
    rep movsb
    PrintString szDest ;Delphi 2010
    ret
main endp
end main


上面的例子, 假如不使用重复前缀...


; Test29_2.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.data
    szSource db 'Delphi 2010', 0 
    len      equ $ - szSource - 1
    szDest   db len dup(?), 0
.code
main proc
    lea esi, szSource
    lea edi, szDest
    mov ecx, len
    cld
@@: movsb
    dec ecx
    jnz @B
    PrintString szDest
    ret
main endp
end main


MOVSD 例:


; Test29_3.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.data
    ddSource dd 11h,22h,33h
    ddDest   dd lengthof ddSource dup(?)
.code
main proc
    lea esi, ddSource
    lea edi, ddDest
    mov ecx, lengthof ddSource
    cld
    rep movsd
    DumpMem offset ddDest, sizeof ddDest ;11 00 00 00 - 22 00 00 00 - 33 00 00 00
    ret
main endp
end main


MOVSW 例:


; Test29_4.asm
.386
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.data
    ddSource dw 11h,22h,33h
    ddDest   dw lengthof ddSource dup(?)
.code
main proc
    lea esi, ddSource
    lea edi, ddDest
    mov ecx, lengthof ddSource
    cld
    rep movsw
    DumpMem offset ddDest, sizeof ddDest ;11 00 22 00 - 33 00 00 00
    ret
main endp
end main


CMPSD 例:


; Test29_5.asm
.386p
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.data
    ddVal1 dd 1234h
    ddVal2 dd 5678h
.code
main proc
    lea esi, ddVal1
    lea edi, ddVal2
    cmpsd
    je L1
    PrintText '两数不等'
    jmp L2
L1: PrintText '两数相等'
L2: ret
main endp
end main


CMPSW 例:


; Test29_6.asm
.386p
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.data
    dwArr1 dw 1,2,3,4,5
    dwArr2 dw 1,3,5,7,9
.code
main proc
    lea esi, dwArr1
    lea edi, dwArr2
    mov ecx, lengthof dwArr1
    cld
    repe cmpsw
    je L1
    PrintText '两数组不等'
    jmp L2
L1: PrintText '两数组相等'
L2: ret
main endp
end main


对比数组时, 假如数组长度不一致...


; Test29_7.asm
.386p
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.data
    dwArr1 dw 1,2,3,4,5
    dwArr2 dw 1,2,3,4,5,6
.code
main proc
    lea esi, dwArr1
    lea edi, dwArr2
    mov ecx, lengthof dwArr1
    cmp ecx, lengthof dwArr2
    jne L1
    cld
    repe cmpsw
    jne L1
    PrintText '两数组相等'
    jmp L2
L1: PrintText '两数组不等'
L2: ret
main endp
end main


如果对比的是 0 结束的字符串, 长度不一致也不用考虑


; Test29_8.asm
.386p
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.data
    szText1 db 'Delphi 2010', 0
    szText2 db 'Delphi 2011', 0
.code
main proc
    lea esi, szText1
    lea edi, szText2
    mov ecx, lengthof szText1
    cld
    repe cmpsb
    je L1
    PrintText '字符串不同'
    jmp L2
L1: PrintText '字符串相同'
L2: ret
main endp
end main


SCASB 例:


; Test29_9.asm
.386p
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.data
    szText db 'ABCDEFGH', 0
.code
main proc
    lea edi, szText
    mov al, 'F'
    mov ecx, lengthof szText - 1
    cld
    repne scasb
    je L1
    PrintText '没找到'
    jmp L2
L1: sub ecx, lengthof szText - 1
    neg ecx
    PrintDec ecx ;如果找得到, 这里显示是第几个字符; 本例结果是 6
L2: ret
main endp
end main


STOSB 例:


; Test29_10.asm
.386p
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.data
    len = 31
    szText db len dup(0), 0
.code
main proc
    lea edi, szText
    mov al, 'x'
    mov ecx, len
    cld
    rep stosb
    PrintString szText ;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    ret
main endp
end main


LODSW 例: 数组求和


; Test29_11.asm
.386p
.model flat, stdcall

include    windows.inc
include    kernel32.inc
include    masm32.inc
include    debug.inc
includelib kernel32.lib
includelib masm32.lib
includelib debug.lib

.data
    dwArr dw 1,2,3,4,5,6,7,8,9,10
.code
main proc
    lea esi, dwArr
    mov ecx, lengthof dwArr
    xor edx, edx
    xor eax, eax
@@: lodsw
    add edx, eax
    loop @B
    PrintDec edx ;55
    ret
main endp
end main
分享到:
评论

相关推荐

    汇编语言指令大全最新发布完整版

    ### 汇编语言指令详解 #### 一、数据传送指令 1. **基本数据传送指令** - **MOV**:简单数据项之间的传送。 - **语法**: `MOV destination, source` - **MOVSX**:符号扩展传送。 - **语法**: `MOVSX ...

    汇编指令大全。。。。。。。。

    - 可以结合`REPZ`, `REPNZ`, `REPE`, `REPNE`, `REPCC`, `REPNCC`等条件指令使用。 **7.2 LOOP指令** - **功能**:循环控制指令。 - **语法**: - `LOOP label`:如果CX不为0,则跳转到label并递减CX。 - `...

    汇编指令命令大全学习

    - **REP**/**REPE**/**REPNE**/**REPZ**/**REPNZ**/**REPC**/**REPNC**:重复前缀指令,用于重复执行字符串操作指令直到条件满足为止。 #### 三、跳转指令 1. **简单跳转指令** - **JMP**:无条件跳转。 - **...

    cpu与汇编第二章指令系统.ppt

    - **MOVS、CMPS、SCAS、LODS**:用于处理内存中的连续数据,常与REP前缀结合使用,实现重复操作。 - **REP、REPE/REPZ、REPNE/REPNZ**:用于重复执行指令,直到特定条件不满足为止。 5. **控制转移指令**: - **...

    8080汇编指令,大家快来下啊

    - **MOVS**, **CMPS**, **SCAS**, **LODS**, **STOS**: 用于字符串操作的指令集,如复制、比较、搜索等。 - **REP**, **REPE**, **REPNE**, **REPCC**, **REPNCC**: 控制重复执行上述串操作指令的条件。 ### 五、...

    汇编指令的英文对照名

    汇编指令是计算机硬件与软件之间的一层抽象接口,它允许程序员直接控制计算机的硬件操作。在编程领域,汇编语言是一种低级语言,每个指令通常对应一个机器码,因此对于理解和优化计算机底层操作十分关键。以下是标题...

    汇编指令 快速参考

    ### 汇编指令快速参考知识点详解 #### 一、数据传送指令 汇编语言中的数据传送指令主要用于在寄存器之间或者寄存器与内存之间传输数据。 **MOV(移动)** - **功能**: 将一个操作数的值复制到另一个操作数中。 - *...

    8086 汇编速查手册

    - **MOVS**/**CMPS**/**SCAS**: 串操作指令,用于在内存之间复制数据或比较数据。 - **LODS**/**STOS**: 用于从内存加载数据或将数据存储到内存。 - **REP**: 控制指令,用于重复串操作直到计数寄存器CX或ECX为零。 ...

    8088 汇编速查手册

    - **REPE**/**REPNE**/**REPZ**/**REPNZ**/**REP**/**REPC**/**REPNCC**:这些前缀可以重复执行前面的字符串操作指令,直到满足特定条件为止。 #### 八、转移指令 - **JMP**/**CALL**/**RET**/**RETF**:跳转、...

    8086汇编速查指令集

    - **MOVS**、**CMPS**、**SCAS**、**LODS**、**STOS**:这些指令支持字符串的复制、比较、搜索、加载、存储等操作。 - **REP**、**REPE**、**REPNE**、**REPZ**、**REPNZ**:重复前缀指令,用于控制字符串指令重复...

    8086 汇编语言六大编程指令集

    ### 8086汇编语言六大编程指令集解析 #### 一、数据传输指令 在8086汇编语言中,数据传输指令是非常基础且重要的指令集合,主要用于实现寄存器之间的数据移动以及寄存器与内存之间的数据交换。 - **MOV指令**:...

    汇编速查手册

    - **REP/REPE/REPNE/REPCC/REPNCC**:重复前缀指令,根据条件重复执行前面的字符串操作指令。 #### 七、转移指令 1. **直接转移** - **JMP**:跳转指令,无条件转移到指定地址。 - **CALL**:调用指令,保存返回...

    汇编速查手册~~~~~

    - **REP/REPE/REPNE/REPCC/REPNCC**:控制字符串操作指令的重复次数。 - 示例:`REP MOVSB`(重复执行MOVSB指令直到CX寄存器为0) #### 八、程序流程控制指令 1. **转移指令** - **JMP/CALL/RET**:无条件转移...

    汇编指令的英文全称

    - 常与 **REP (Repeat)**、**REPE (Repeat if Equal)**、**REPNE (Repeat if Not Equal)** 配合使用,实现重复操作。 ### 寄存器英文全称 寄存器是CPU内部的重要组成部分,用于临时存储数据或指令。8086 CPU的...

    汇编语言指令集

    - **REP(重复前一条指令)**:重复执行前一条字符串处理指令。 - **REPE(重复直到相等)**:重复执行前一条字符串处理指令直到两个值相等。 - **REPZ(重复直到为零)**:重复执行前一条字符串处理指令直到ZF=1。 ...

    汇编指令及说明举例

    ### 汇编指令及说明举例 #### 一、数据移动指令 1. **MOV**:数据移动指令,用于将一个寄存器或内存位置的数据移动到另一个寄存器或内存位置。 - 示例:`MOV AX, BX` 将BX寄存器中的值移动到AX寄存器。 2. **...

    汇编指令对应的英文解释

    在IT行业的深度领域中,汇编语言作为计算机底层操作的核心技术之一,其指令集的掌握对于程序员、系统架构师以及硬件工程师来说至关重要。本文将基于给定文件中的信息,深入解析汇编指令及其对应的英文解释,帮助读者...

    8080免杀汇编学习手册

    - `MOVS`, `CMPS`, `SCAS`, `LODS`, `STOS`:这些指令用于字符串处理,如复制、比较等。 - `REP`, `REPE`, `REPNE`, `REPZ`, `REPNZ`:重复前缀,用于重复执行上述字符串操作。 6. **跳转指令**: - `JMP`, `...

    汇编指令大全 汇编语言的学习

    - 串操作指令包括`REP`、`REPE`、`REPNE`前缀,配合`MOVS`、`CMPS`、`STOS`、`LODS`和`SCAS`等,用于高效处理连续内存区域的数据。 汇编指令的掌握是学习汇编语言的基础,了解和熟练运用这些指令,可以编写出更...

Global site tag (gtag.js) - Google Analytics