`
zzc1684
  • 浏览: 1190474 次
  • 性别: 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
分享到:
评论

相关推荐

    汇编语言指令系统、伪指令

    数据 传送 指令 通用数据传送指令 传送指令MOV 堆栈操作指令PUSH、POP ... MOVS、CMPS、LODS、STOS、SCAS 处理器   控制   指令 标志操作指令 CLC、STC、CLD、STD、CLI、STI 处理机控制指令 HLT

    汇编指令(chm格式)

    8088 汇编速查手册 一、数据传输指令 ─────────────────────────────────────── 它们在存贮器和寄存器、寄存器和输入输出端口之间传送数据. 1. 通用数据传送指令. ...

    The Art of Assembly Language Programming

    You are visitor as of October 17, 1996. The Art of Assembly Language Programming <br>Forward Why Would Anyone Learn This Stuff? 1 What's Wrong With Assembly Language 2 What's Right With ...

    开源一STM32项目,CAN,UART,Input检测 原创相对高效性能与代码重用平衡思路,可直接做工程模板

    0x08001236 000A MOVS r2,r1 0x08001238 F1A10301 SUB r3,r1,#0x01 0x0800123C 4619 MOV r1,r3 0x0800123E D1FA BNE 0x08001236 */ N--; } } 4、输入检测 中断定时进行输入扫描,定义有效无效电平消抖时间...

    汇编指令 中文对照

    通用數據傳送指令. MOV (MOVe) 傳送字或字節. MOVS (MOVe String) 串傳送指令 MOVSX 先符號擴展,再傳送. MOVZX 先零擴展,再傳送. PUSH 把字壓入堆棧. POP 把字彈出堆棧. PUSHA 把AX,CX,DX,BX,...

    常用ARM指令集及汇编(经典)

    本人资料全部免费,欢迎大家下载! =========================================== 网上搜到的资料,如题,是常用ARM指令集及汇编的总结,反正免费,不下白不下

    一些基本的汇编指令集合

    基本汇编指令集 MOV (MOVe) 传送字或字节. MOVS (MOVe String) 串传送指令 MOVSX 先符号扩展,再传送. MOVZX 先零扩展,再传送. PUSH 把字压入堆栈. POP 把字弹出堆栈. PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.

    一个win32下的ARM开源编译器

    FASMARM currently supports the full range of instructions for 32-bit and 64-bit ARM processors and coprocessors up to and including v8. Contents: 1. ARM assembly compatibility 2. UAL and pre-UAL...

    AT&T Assembly Language

    其中包括一些如何使用汇编链接C语言库,汇编调用系统调用,汇编执行浮点运算,C语言内嵌汇编等。 Chapter 1: What Is Assembly Language? 1 Processor Instructions 1 Instruction code handling 2 Instruction code...

    f1ucoss终结版.rar

    movs r0, #2 /* Switch to the psp stack. */ msr CONTROL, r0 pop {r0-r5} /* Pop the registers that are saved automatically. */ mov lr, r5 /* lr is now in r5. */ cpsie i /* The first task has its ...

    Microsoft Library MSDN4DOS.zip

    REP/REPE/REPZ/REPNE/REPNZ Repeat Following String Operation RET Return from Procedure SAHF Store AH into Flags SAL/SAR/SHL/SHR Shift Instructions SBB Integer Subtraction with Borrow SCAS/SCASB/SCASW/...

    peli-xr:Peli-xr 插件库

    Peli-Xr - Showtime 插件Showtime => 信息/插件支持,在 EOL 论坛 => Peli-XR 是什么?... allmyvideos、bestreams、filenuke、magnovideo、mightyupload、movs hare、novamov、nowvideo、playedto、s

    movs1p9en

    movs1p9en

    CE中文版-启点CE过NP中文.exe

    启点CE过NP中文December 24 2018:Cheat Engine 6.8.2 Released: Here's a new version for the hollidays. Mainly minor improvements and some small bugfixes, but also a new 'ultimap like' feature called ...

    安川机器人编程指令含义.pdf

    安川机器⼈编程指令含义 TEAM BUTLDING MOTOMAN INFORM 说明 1.输出⼊命令 2.控制命令 控制命令 终端屏幕: 通过主菜单的[输⼊输出]-----[终端]显⽰。另外,独⽴控制功能有效时,每个任务页码不同。CLS消去终端屏幕...

    VideoPlayer.txt

    这是一个用Andriod Studio 开发的简易播放器源文件。主要用MediaPlayer+SurfaceView 进行视频的播放。能够通过SeekBar组件控制音量,控制视频的播放进度,以及实时的显示视频的播放进度。具有稳定的播放,暂停控制的...

    video-editor-setup.exe

    GiliSoft Video Editor 软件功能包括了在视频或音频中随意截取出一段保存,支持批量截取;可以合并多个视频/音频;裁剪视频画面尺寸;分割视频到多个小片段;给视频添加水印、添加外挂字幕;旋转视频画面;...

    NIST SP800-17.pdf

    The National Institute of Standards and Technology (NIST) Modes of Operation Validation System (MOVS) specifies the procedures involved in validating implementations of the DES algorithm in FIPS PUB ...

    ffmpeg-20200828-ccc7120-macos64-static_ffmpeg_Free!_

    This program is free software: you can redistribute it and/or modifyit under the terms of the GNU General Public License as published bythe Free Software Foundation either version 3 of the License or...

    元器件应用中的带串联电容补偿装置的高压输电线路双端故障测距新算法

    对于带串联电容补偿装置的输电线路(串补线路),由于串联电容的存在以及串联电容并联保护元件MOVs的非线性,现有的故障测距算法并不能直接应用到串补线路的故障测距中。因此,提出了一种采用双端电气量的串补线路...

Global site tag (gtag.js) - Google Analytics