2012-07-14 127 views
2

我用匯編語言編寫了一個簡單的程序,試圖在我的64位Ubuntu操作系統上運行它。但是,「分段錯誤(核心轉儲錯誤)」失敗。AT&T彙編代碼中的分段錯誤(核心轉儲)錯誤

這裏是我的代碼:

.section .data 
    values : 
     .int 10, 15, 20, 25, 30 ,35, 40, 45, 50, 55, 60 
    output : 
     .asciz "The value is %d\n" 
    .section .text 
    .globl main 
    main : 
     nop 
     movl $0, %edi 
    loop : 
     movl values(, %edi, 4), %eax 
     pushq %rax 
     pushq $output 
     call printf 
     addl $8, %esp 
     inc %edi 
     cmpl $11, %edi 
     jne loop 
     movl $0, %ebx 
     movl $1, %eax 
     int $0x80 
+0

我認爲你的'''''寄存器的大部分應該是'r__'。它看起來像是寫成x86程序集,並強制移植到x64而沒有進行所有必要的更改。 – Mysticial 2012-07-14 03:33:00

+0

我試過了,但它也無法工作。 – Nmzzz 2012-07-14 03:34:33

+1

組裝爲64bit?然後堆棧不是DWORD但QWORD對齊,所以你添加8到rsp是錯誤的,應該在printf調用之後將16添加到rsp – Gunner 2012-07-14 04:44:21

回答

3

有你的代碼的多個問題。

64bit Ubuntupushq %rax我推斷您正在嘗試製作64位可執行文件。

如果是這樣的話,那麼......

這裏:

pushq %rax 
pushq $output 
call printf 
addl $8, %esp 

你沒有正確平衡函數調用後堆棧。你還記得這是64位的代碼嗎?您需要添加到rsp,而不是esp。另外,如果你推2個8字節參數,你必須刪除2個8字節的參數,這意味着你必須添加16個,而不是8個。

但它比這更糟糕。在64位模式下,參數傳遞的方式不同。第一個參數在寄存器rdi,rsi,rdx,rcx, r8r9中。所以,這給了我們:

movq %rax, %rsi 
movq $output, %rdi 
movq $0, %rax ; number of vector registers used for var-arg-function printf() 
call printf 

這裏:

inc %edi 

您只需通過電話,並通過使用該寄存器傳遞參數摧毀rdi值。您需要在通話之前手動按rdi,然後將其彈回。或者你可以把它保存在一個全局變量中。如果您選擇推動和彈出,請確保在任何call指令之前,堆棧指針rsp總是以16字節對齊。

這裏:

movl $0, %ebx 
movl $1, %eax 
int $0x80 

您使用的是32位系統調用接口。在64位程序,你必須使用64位系統調用接口:

movq $60, %rax ; sys_exit 
movq $0, rdi ; return 0 (success) 
syscall 

現在,我覺得這有可能有問題,太:

movl $0, %edi 
loop : 
movl values(, %edi, 4), %eax 

一般情況下,你不應該在64位代碼的地址計算中使用32位寄存器和32位指令。我將其更改爲:

movl $0, %rdi 
loop : 
movl values(, %rdi, 4), %eax 

如果沒有這兩個作品,因爲values地址是超過2GB遠離rip(事實:排量被限制爲32位有符號整數內存操作數在大多數指令在64位模式下,它們中的大多數在64位模式下都沒有位移存儲器操作數編碼,它們在那裏使用rip相對尋址),則需要手動將values的64位地址和索引該數組乘以4.確保在執行64位加法時不會出現任何截斷。

必備寫着:

  • System V應用程序二進制接口AMD64架構處理器補充草案版本0.99.6

  • 需要不同的C++編譯器約定和操作系統通過昂納霧

+0

你真好。非常感謝你。我正在閱讀專業彙編語言,它的代碼樣本全部是在32位操作系統上編寫的,所以當我在64位操作系統上測試它時遇到了很多問題。再次感謝你! – Nmzzz 2012-07-14 05:20:44