# 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." # 44
length:
.int 11 # 44/4 = 11
string2:
.ascii "test"
.section .text
.globl main
main:
nop
leal string1, %edi
leal string2, %esi
movl length, %ecx
lodsl
cld
repne scasl
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 14 14-scas.s -m32
# echo $?
# 0
# 因为四个字节的分组,没有一组是test,所以没有找到。
# "this" " is " "a te" "st -" " a l"...
#
# SCASW、SCASL不能很好地处理字符串,但是,在数据数组中搜索非字符串数据时,还是有用的。
#