九、小白逆向之路之用汇编写字符串比较函数

本文目的
利用REPNZ SCASB指令 以及 REPE CMPSB指令来写一个字符串比较函数
本文概要
1.REPNZ SCASB指令介绍
2.REPE CMPSB指令介绍
3.字符串比较函数编写

一、REPNZ SCASB指令介绍

image.png

这两个指令组合起来就是用来寻找字符串中的字符的
值得一说的是 SCASB SCASW SCASD是一个系列的指令,只是操作数的字节数变了

二、REPE CMPSB指令介绍

image.png

简而言之这两个指令就是用 edi 和 esi 指向两个字符串,然后一个字节一个字节的比较,如果不相同(ZF = 0)则跳出

三、字符串比较函数编写

#include<cstdio>

__declspec(naked) int asm_strcmpA(char* s1,char* s2)  // 告诉编译器不用帮忙做堆栈平衡,因为我们要传递参数出去,所以自己来做
{
    __asm{
            /*1、先用ecx算出字符串s1的长度
            2、再来进行比较*/
            push ebp
            mov ebp,esp
            push ecx
            push esi
            push edi

        
            xor al,al                        ;al = 0,字符串结束就是0
            mov ecx,-1                   ;ecx = FFFFFFFF
            mov edi,s1                   ;edi = s1
            repne scasb                 ;[edi]与 al相比较 不等就重复比较 ecx--  edi++
            not ecx                        ;ecx = s1的长度加1

            mov edi,s1;edi = s1
            mov esi,s2;esi = s2
            repe cmpsb                 ;[edi]与[esi]相比较 不等就跳出 相等就重复比较 ecx--  edi/esi++
            xor al,al
            mov al,[edi-1]
            sub al,[esi-1]                ;取最后一个不同的字符相比较,结果存在al中,作为返回值
            
            pop edi
            pop esi
            pop ecx
            pop ebp 
            retn
          }
}

int main()
{
    printf("asm_strcmpA\n");
    printf("%d\n",asm_strcmpA("abcd","abcd"));
    getchar();
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.地址总线,数据总线,控制总线在哪里,它们有什么作用?答:它们都是cpu连接外部组件的线路。地址总线:地址总线A...
    MagicalGuy阅读 1,487评论 0 1
  • 原文地址:C语言函数调用栈(一)C语言函数调用栈(二) 0 引言 程序的执行过程可看作连续的函数调用。当一个函数执...
    小猪啊呜阅读 4,665评论 1 19
  • 2.9内存复制 本节必须掌握的知识点: 掌握MOVS指令、STOS指令、REP指令的格式、功能 在上一节中介绍...
    编程达人阅读 1,679评论 0 0
  • 本文首发于我的博客 Bomb Lab 实验代码见GitHub 简介 BombLab是CS:APP中对应第三章内容:...
    viseator阅读 14,298评论 0 14
  • 1. 字符串原语指令 使用重复前缀如果添加重复前缀,则使用ECX作为计数器重复该指令。 复制字符串 方向标志字符串...
    _凌浩雨阅读 1,278评论 0 3