2014-09-29 34 views
0

我剛開始學習x86程序集,我不得不做一個練習,這是我無法解決的。 這個想法是製作一個程序,讓用戶使用Scanf鍵入一個數字。然後該程序將數字加1並輸出該數字(所以基本上輸出=輸入+1)。基本程序集練習我無法解決

當我使用我的代碼時,控制檯顯示我一個分段錯誤。

代碼:

mystring: .asciz "name_of_the_programmer\nLast_Name\nAssignment 2:inout\nGive a number:\n" #Creëert een stuk tekst 
nrstring: .asciz "%d" 

.global main 


main: 

    movq  $0, %rax        #Geeft de locatie %rdi een waarde van 0, maakt %rdi leeg 
    movq  $mystring, %rdi        #Voegt de waarde van mystring (het stuk tekst) toe aan %rdi 
    call  printf         #Print de waarde van %rdi 
    call  inout         #roept inout op 

inout: 

     pushq %rbp 
     movq %rsp , %rbp 

     subq $8, %rsp         #Plaatst stackPointer goed 
     leaq -8(%rbp), %rsi        #Laad het adres in rsi 

     movq $0, %rdi         #Maakt rdi leeg  
     movq $nrstring, %rdi        #Verplaatst string nrstring naar rdi (1e arg. scanf) 
     movq $0, %rax         #Maakt RAX leeg (2e arg. scanf) 
     call scanf         #Roept Scanf op 

     incq %rdi 
     movq %rdi, %rax 
     call printf 

     movq %rbp, %rsp 
     popq %rbp 
     ret 

end: 
    mov   $0, %rdi        #Maakt %rdi leeg 
    call  exit         #Sluit het programma af 

我來自荷蘭,所以請不要對意見擔心,我爲我的英語不好道歉。

+2

問題是*哪裏*是分段故障?您可以使用調試器來遍歷程序,並找到導致它的步驟。一旦你知道哪個指令導致它,你可以考慮*爲什麼*該指令做錯了,並修復它。獲取你的調試器。 – 2014-09-29 12:39:03

+0

@TNH你的英語並不差。例如,我不能用荷蘭語說一個字。但是,在您的來源中使用除英語之外的任何其他語言通常是一個糟糕的主意,無論是代碼還是評論。這是一個完美的例子:如果這些評論是英文的,那麼也許我們中的一些人可以發現你的代碼與你的實際意圖不符;或者至少他們會提供一些更清晰的SegFault可能來自哪裏的線索。 – Powerslave 2014-09-29 13:37:21

回答

0

不知道太多關於您運行此代碼的環境我得出的結論是您將%RSI設置爲堆棧中您忘記將DS初始化爲SS中的值的地址!

爲什麼你首先要清空%RDI?

movq $0, %rdi   #Maakt rdi leeg  
movq $nrstring, %rdi #Verplaatst string nrstring naar rdi 

濟hoeft濟Niet的TE verontschuldigen DAT濟麪包車荷蘭komt! Schrijf wel steeds Engelstalige commentaren。 Programmeren lukt zoveel beter als je de de hele tijd in dezelfde taal blijft denken/werken。 Welkom op dit論壇!