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
#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值