# An example - Finding the size of a string using the SCAS instruction (计算字符串长度)
#
# SCAS : 扫描字符串搜索一个或者多个字符。
# 使用EDI作为隐含的目标操作数,必须包含要扫描的字符串的内存地址。
# (DF 标志)
# 会相应地设置EFLAGS的辅助进位、进位、奇偶校验、溢出、符号和零标志。
# 可以使用标准的条件分支指令检查扫描的结果。
#
# 与REPE和REPNE前缀一起使用时:
# REPE : 扫描字符串的字符,查找不匹配搜索字符的字符
# REPNE : 扫描字符串的字符,查找匹配搜索字符的字符
#
# 对于大多数字符串扫描,使用REPNE指令,因为它将在字符串中找到搜索字符时停止扫描。
# 当找到字符时,EDI包含紧跟在定位到的字符后面的内存地址。这是因为REPNE在执行SCAS之后递增EDI。
# ECX包含搜索字符距离字符串末尾的位置。使用这个值时要谨慎,因为它是从字符串的末尾开始计数的。
# 为了得到距离字符串开头的位置,要从这个值减去字符串长度并且反转符号。
#
.section data
string1:
.asciz "Testing, one, two, three, testing.\n"
.section .text
.globl main
main:
nop
leal string1, %edi
movl $0xffff, %ecx
movb $0, %al
cld
repne scasb
jne notfound
subw $0xffff, %cx
neg %cx
dec %cx
movl $1, %eax
movl %ecx, %ebx
int $0x80
notfound:
movl $1, %eax
movl $0, %ebx
int $0x80
# gcc -g -o 15 15-scas.s -m32
# echo $?
# 35
#