相关疑难解决方法(0)

为什么System V/AMD64 ABI要求16字节堆栈对齐?

我读过的,因为它是为"业绩原因"做不同的地方,但我仍然不知道什么是在性能得到这个16字节对齐提高了特殊情况.或者,无论如何,选择这个的原因是什么.

编辑:我想我以误导的方式写了这个问题.我没有询问为什么处理器使用16字节对齐的内存更快地处理事情,这在文档中随处可见.我想要知道的是,强制执行16字节对齐比仅让程序员在需要时自己对齐堆栈更好.我问这个是因为根据我的汇编经验,堆栈实施有两个问题:只有少于1%的执行代码才有用(所以其他99%实际上是开销); 它也是一个非常常见的错误来源.所以我想知道它最终是如何得到回报的.虽然我对此仍有疑问,但我接受了彼得的回答,因为它包含了我原来问题的最详细答案.

assembly x86-64 abi

5
推荐指数
1
解决办法
1144
查看次数

从无法对齐RSP的函数调用时,glibc scanf分段错误

编译以下代码时:

global main
extern printf, scanf

section .data
   msg: db "Enter a number: ",10,0
   format:db "%d",0

section .bss
   number resb 4

section .text
main:
   mov rdi, msg
   mov al, 0
   call printf

   mov rsi, number
   mov rdi, format
   mov al, 0
   call scanf

   mov rdi,format
   mov rsi,[number]
   inc rsi
   mov rax,0
   call printf 

   ret
Run Code Online (Sandbox Code Playgroud)

使用:

nasm -f elf64 example.asm -o example.o
gcc -no-pie -m64 example.o -o example
Run Code Online (Sandbox Code Playgroud)

然后运行

./example
Run Code Online (Sandbox Code Playgroud)

它运行,打印:输入数字: 但随后崩溃并打印: 分段错误(核心已转储)

因此,printf可以正常工作,而scanf则不能。我对scanf有什么错呢?

linux assembly x86-64 nasm calling-convention

2
推荐指数
1
解决办法
515
查看次数

标签 统计

assembly ×2

x86-64 ×2

abi ×1

calling-convention ×1

linux ×1

nasm ×1