• Intel汇编-在字符串中搜索一个字符


    # An example of the SCAS instruction (在字符串中搜索一个字符)
    #
    # SCAS : 扫描字符串搜索一个或者多个字符。
    #     使用EDI作为隐含的目标操作数,必须包含要扫描的字符串的内存地址。
    #     (DF 标志)
    #     会相应地设置EFLAGS的辅助进位、进位、奇偶校验、溢出、符号和零标志。
    #     可以使用标准的条件分支指令检查扫描的结果。
    #
    # 与REPE和REPNE前缀一起使用时:
    # REPE  : 扫描字符串的字符,查找不匹配搜索字符的字符
    # REPNE : 扫描字符串的字符,查找匹配搜索字符的字符  
    #
    # 对于大多数字符串扫描,使用REPNE指令,因为它将在字符串中找到搜索字符时停止扫描。
    # 当找到字符时,EDI包含紧跟在定位到的字符后面的内存地址。这是因为REPNE在执行SCAS之后递增EDI。
    # ECX包含搜索字符距离字符串末尾的位置。使用这个值时要谨慎,因为它是从字符串的末尾开始计数的。
    # 为了得到距离字符串开头的位置,要从这个值减去字符串长度并且反转符号。
    #

        .section data
    string1:
        .ascii "This is a test - a long text string to scan."
    length:
        .int 44
    string2:
        .ascii "-"

        .section .text
        .globl main
    main:
        nop
        leal string1, %edi
        leal string2, %esi
        movl length, %ecx
        lodsb
        cld
        repne scasb
        jne notfound
        subw length, %cx
        neg %cx
        movl $1, %eax
        movl %ecx, %ebx
        int $0x80

    notfound:
        movl $1, %eax
        movl $0, %ebx
        int $0x80

    # gcc -g -o 13 13-scas.s -m32
    # echo $?
    # 16
    #

  • 相关阅读:
    Vue路由传参三种方式
    mysql连接池的实现
    如何监测 Linux 的磁盘 I/O 性能
    MySQL - InnoDB记录结构
    Qt串口:QSerialPort、QSerialPortInfo
    PY32F003F18之DMA串口
    线性代数的学习和整理17:向量空间的基,自然基,基变换等(未完成)
    Gradle Sync Error : ANDROID_HOME 与 ANDROID_SDK_ROOT 指向不一致
    Vue History模式的Nginx配置
    Mybatis-MyBatis的缓存
  • 原文地址:https://blog.csdn.net/xiaozhiwise/article/details/127407470