assembly - x86-64 在一次读取 8 个字符的循环中对齐数据?
问题描述
strlen:
xor r8,r8
.Lalignlong:
test rdi, 0xf
je .LfindNull
prefetch [rdi + 8]
cmp Byte PTR [rdi], 0
je .LansNoAdd
inc r8
inc rdi
jmp .Lalignlong
# do while is faster than while because of less jumps (Agner)
.LfindNull:
mov r9, 0xFEFEFEFEFEFEFEFF
mov r10, 0x8080808080808080 # citation: Bit Twiddling Hacks Sean Eron Anderson
prefetch [rdi + 192]
mov rcx, [rdi]
lea rax, [rcx + r9]
not rcx
and rcx, rax
and rcx, r10
jne .Lanswer
nop # no idea why this makes it 2 cycles faster. findloop changes from 4a -> 4b
.Lfindloop:
prefetch [rdi + 420]
mov rcx, [rdi + 8]
add rdi, 8
add r8, 8
lea rax, [rcx + r9]
not rcx
and rcx, rax
and rcx, r10
je .Lfindloop
.Lanswer:
bsf rcx, rcx
shr rcx, 3
lea rax, [rcx + r8]
ret
.LansNoAdd:
mov rax, r8
ret
这应该是 x86 64 位汇编代码,用于计算一个 char 字符串的长度,并将字符串的地址传递给 RDI。
我不明白第一.Lalignlong
部分;那会做数据对齐吗?
如果是,它应该如何工作?尤其是这条线test rdi, 0xf
让我非常困惑。
解决方案
推荐阅读
- spring - 使用单个 Connection / DataSource / SessionFactory / TransactionManager 休眠多个模式
- hyperledger - Hyperledger Sawtooth 在哪里存储其分类帐?
- c# - 如何在 C# 中编写 bat 脚本
- c++ - Metalog 所有日志都用 [kernel] 打印
- javascript - 直接在html中使用ES6模块中定义的函数
- javascript - 富文本编辑器上的粘贴按钮问题
- python - 如何在不同的机器上使用 Django 查询
- c# - 在服务器上构建解决方案时出错
- c# - 如何找出当前会话不保留数据的原因?
- node.js - aws-amplify auth currentSession 不返回当前用户