2016-07-09 64 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

謝謝,我最大的問題是我不知道返回地址通過了輸入將它放入註冊表中 –