串操作指令

  串操作指令可以方便对一组连续的数据进行操作。串操作后自动根据DF标志位修改ESI和EDI,DF = 0时,ESI,EDI递增,DF = 1时,ESI,EDI递减。串操作指令有2组,1组实现数据串传送,另1组实现数据串检测。串操作指令通常需要反复执行,所以常与重复指令前缀联合使用,它通过计数器ECX控制重复执行串指令的次数。

 

1.串传送指令

这组指令实现对串的传送,它们有,MOVS,STOS,LODS,可以配合REP前缀,但不影响标志。

MOVSB      ;BYTE PTR[EDI] = BYTE PTR[ESI]

MOVSW      ;WORD PTR[EDI] = WORD PTR[ESI]

MOVSD      ;DWORD PTR[EDI] = DWORD PTR[EDI]

STOSB      ;BYTE PTR[EDI] = AL

STOSW      ;WORD PTR[EDI] = AX

STOSD      ;DWORD PTR[EDI] = EAX

LODSB      ;AL = BYTE PTR[ESI]

LODSW      ;AX = WORD PTR[ESI]

LODSD      ;EAX = DWORD PTR[ESI]

 

REP重复指令前缀,可以表示为当ECX != 0时,则继续执行,直到ECX = 0。可以说,ECX指明了重复次数。如果不使用REP前缀,那么串指令其实是只被执行1次的,这是很多新手易出错的地方。

比如,我们可以使用串传送指令代替ZeroMemory。

结合上篇文章,我们可以定义一个宏,程序源码如下:

ZeroMem        MACRO    Addr,Size
    cld    ;;CLD标志位清0,表示递增正向传输
    xor    al,al
    mov    edi,Addr
    mov    ecx,Size
    rep    stosb
endm

调用格式如下:

ZeroMem 数据串地址,长度

 

2.串检测指令

这组指令包含有CMPS和SCAS。由于串比较指令和减法的实质是一样的,所以它们也影响标志位。这两个串操作指令可以和REPE/REPZ和REPNE/REPNZ联合使用,通过ZF判断是否相等。

CMPSB      ;BYTE PTR[ESI] - BYTE PTR[EDI]

CMPSW      ;WORD PTR[ESI] - WORD PTR[EDI]

CMPSD      ;DWORD PTR[ESI] - DWORD PTR[EDI]

SCASB      ;AL - BYTE PTR[EDI]

SCASW      ;AX - WORD PTR[EDI]

SCASD      ;EAX - DWORD PTR[EDI]

 

REPE/REPZ    ;每执行一次指令,ECX递减1。如果ECX = 0或ZF = 0,则结束重复执行

REPNE/REPNZ   ;每执行一次指令,ECX递减1。如果ECX = 0或ZF = 1,则结束重复执行

 

实际运用时要注意区分,串操作指令结束时因为比较完了,还是因为标志位问题。

我根据串操作指令定义了一个宏,可以代替ComapreMemory,如下:

CmpMem        MACRO    Addr1,Addr2,Size
    LOCAL    n
    xor    eax,eax
    mov    esi,Addr1
    mov    edi,Addr2
    mov    ecx,Size
    repe    cmpsb    ;;当ZF = 0时,结束是因为有不同
    jnz    n    ;;当两数据串完全相等时,则EAX = 1
    inc    eax
n:
endm

 

 

转载于:https://www.cnblogs.com/galano/p/8721794.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Bash脚本中,进行字符操作时可以使用多种命令和内置的字符处理功能。这里列举几个常用的命令和操作方法: 1. `${变量名#匹配模式}`:从变量的开头删除匹配模式的最短匹配部分。 2. `${变量名##匹配模式}`:从变量的开头删除匹配模式的最长匹配部分。 3. `${变量名%匹配模式}`:从变量的结尾删除匹配模式的最短匹配部分。 4. `${变量名%%匹配模式}`:从变量的结尾删除匹配模式的最长匹配部分。 5. `${变量名/旧字符/新字符}`:将变量中第一次出现的旧字符替换为新字符。 6. `${变量名//旧字符/新字符}`:将变量中所有出现的旧字符替换为新字符。 7. `${变量名/旧字符}`:如果变量以旧字符开头,则删除开头部分。 8. `expr match "$变量" '正则表达式'`:使用正则表达式匹配字符。 9. `expr "$变量" : '正则表达式'`:同样用于使用正则表达式匹配字符,但通常返回匹配的部分。 例如,假设有一个变量`str`,其值为`/home/user/docs/report.txt`,以下是一些操作示例: - 去除路径中的`/home/user/docs/`部分: ```bash echo "${str##*/}" ``` 输出将是`report.txt`。 - 替换文件扩展名为`.doc`: ```bash echo "${str%.txt}.doc" ``` 输出将是`/home/user/docs/report.doc`。 - 计算字符长度: ```bash expr length "$str" ``` 会返回字符`/home/user/docs/report.txt`的长度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值