2013-01-10 99 views
0

我寫的內聯彙編程序的/ home/httpd的取消鏈接「grades.txt」混淆,這裏是代碼:與JMP指令

void main() 
{ 
    __asm__(
    "jmp L\n"\ 
    "sub1:\n"\ 
    "movl 0x4(%esp), %ebx\n"\ 
    "movb $0xa, %al\n"\ 
    "int $0x80\n"\ 
    "L:\n"\ 
    "call sub1\n"\ 
    ".string \"//home//httpd//grades.txt\" " 
    ); 
} 

我覺得代碼應做什麼,我想要斷開「/ home/httpd」中的grades.txt鏈接,但是當我執行它時,會出現段錯誤。

我用gdb來解決這個錯誤,我發現它不能執行「jmp L」這行,程序會在第5行[「__asm __(」]停止,直到我輸入「ctrl + c」打斷了。

如果我添加的組件「退出(0)」,讓程序退出乾淨,並繼續執行它,該程序將只退出而不做任何事情。

,所以這是相當混亂,爲什麼程序不執行jmp指令?有什麼錯誤嗎?

我非常感謝你的幫助!

+0

「call sub1」是否是'call subl'的打印錯誤或者是c中的錯誤頌? –

+0

抱歉,我在網頁上輸入代碼時犯了一個錯誤,在我的機器上都是'調用sub1'。我會修改它。 – Kalzium

+0

這不是'jmp L'導致SIGSEGV。它是'movl 0x4(%esp),%ebx'。目標是x86還是x64?我懷疑你的目標是x64。如果是這種情況,那麼你應該使用rsp而不是esp。 – lego

回答

1

幾件事情:

  • 您應該使用%eax代替%al因爲3個最顯著字節可以不000000
  • movl 0x4(%esp), %ebx行應該是movl (%esp), %ebx,因爲%ebp不壓入堆棧,因此返回地址是在%esp+0
  • doinig之後int 80h代碼將通過並呼籲sub1一遍又一遍,所以你需要一個額外的跳躍:

    int80h 
    add $4, %esp # pop the return address 
    jmp exit  # jump over the call 
    call sub1 
    .... 
    exit: 
    
  • 無需使用\ - 字符串將連接在一起爲你

  • void不是main()用C

總結了有效的返回類型以上提示:

int main() 
{ 
    __asm__(
    "jmp L\n" 
    "sub1:\n" 
    "movl (%esp), %ebx\n" 
    "movl $0xa, %eax\n" 
    "int $0x80\n" 
    "add $4, %esp\n" 
    "jmp exit\n" 
    "L:\n" 
    "call sub1\n" 
    ".string \"//home//httpd//grades.txt\"\n" 
    "exit:\n" 
    ); 
} 
+0

非常感謝!現在問題解決了:) :)非常感謝! – Kalzium