保存被调用方保存的寄存器会导致分段错误

时间:2018-09-27 21:53:23

标签: assembly segmentation-fault x86-64

我正在尝试保存被调用方保存的寄存器。 在下面的代码中,我仅尝试保存%r15(保存其他保存有被调用者的寄存器(一个或全部)时,行为是相同的。)

 .data
     hello: .string "Hello"
     format: .asciz "%s\n"
 .text
     .global _main
 _main:
   pushq %rbp
   pushq %r15
   leaq format(%rip), %rdi
   leaq hello(%rip), %rsi
   callq _printf
   popq  %r15
   popq  %rbp
   movq  $0, %rax
   retq

结果为Segmentation fault: 11。注释pushq %r15popq %r15时,程序将按预期输出Hello

细分错误的原因是什么?该问题在我的Ubuntu和OS X系统上是可重现的,但在Windows的Ubuntu子系统上却不能。

代码被编译为gcc test.s。在OS X上:

$ gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 9.0.0 (clang-900.0.39.2)
Target: x86_64-apple-darwin16.7.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin

0 个答案:

没有答案