2016-07-09 65 views
-1
.text 
.global main 
// code for main 
main: 
    push %r13 
    push %r14 
    push %r15 
    pushq $2 
    call show 
    pop %r15 
    pop %r14 
    pop %r13 
    mov $0,%rax 
    ret 
// code for show 
show: 
    popq x 
    pushq x 
    popq gen 
    lea genfmt_(%rip),%rdi 
    movq gen(%rip),%rsi 
    .extern printf 
    call printf 
    ret 
.data 
gen: .quad 0 
genfmt_: .byte '%','u',10,0 
x: .quad 0 

标题几乎总结了它。我不知道为什么这会产生分段错误错误。根据我的理解,当我按r15,r14,r13时,堆栈指针对齐,然后在调用print f之前保持对齐。我是新来的装配,所以任何帮助表示赞赏!分割故障基本程序集

+1

哪些指令可以导致段错误?在调试器中运行并查看。 (请参阅[x86标记wiki](http://stackoverflow.com/tags/x86/info)。 –

回答

1
show: 
    popq x 

是一个明显的错误。进入函数时栈上的第一件事是返回地址。您尝试登录ret时会遇到问题,因为您已经对返回地址进行了破坏。

此外,64位代码的标准调用约定/ ABI将寄存器中的参数传递给所有参数,所以您不会将明智的参数传递给printf。 (只要你不想从C中调用它们,你可以在你自己的asm函数之间传递args,只要你不想从它们调用它们。)

查看标记wiki获取关于调用约定的更多文档。还有关于使用调试器的信息,这可以让您提出更好的问题(通过显示哪条指令生成了段错误,以及它尝试访问的地址)。

+0

谢谢,我最大的问题是我不知道返回地址通过了输入将它放入注册表中 –