selph
selph
发布于 2022-01-18 / 338 阅读
0
0

《xchg rax,rax》片段分析0x11--二进制数据比较

前言

本次是该系列的的第0x11篇,二进制数据比较,可以是字符串也可以不是,用于判断比较结果是否相同


实验环境:

  • Windows10 + VS2022 + masm

0x11

代码片段链接:xorpd | xchg rax,rax 0x11

.loop:
    mov      dl,byte [rsi]
    xor      dl,byte [rdi]
    inc      rsi
    inc      rdi
    or       al,dl
    loop     .loop

代码分析

这里使用了rsi和rdi分别指向要进行比较的两个数据,把这两个数据的第一字节进行异或操作保存到dl,然后通过or操作把值保存到al里,因为or运算只会让结果变大而不会变小,所以以至于会出现两种情况,就是dl的值始终为0,或者不是,若dl的值始终为0,则表示上面的异或操作的两个操作数始终相同,则表示两边数据是相同的,反之则表示两边数据不相同此处的功能是对比两个二进制数据

测试代码:

.data
    testStr1 db "12345",0
    testStr2 db "12345",0

.code
main proc
	lea rsi, [testStr1]
	lea rdi, [testStr2]
    lea rcx, [5]
    xor rax, rax

loopA:
    mov      dl,byte ptr [rsi]  ;dl = rsi第一个字节
    xor      dl,byte ptr [rdi]  ;dl = rsi第一个字节 ^ rdi第一个字节
    inc      rsi                ;rsi向后移动一字节
    inc      rdi                ;rdi向后移动一字节
    or       al,dl              ;al = al | dl
    loop     loopA              ;循环完输入数据长度

	ret
main ENDP
END

评论