2010-09-25 63 views
0

我正在嘗試學習低級開發。通過將ebx中的0和eax中的1(用於exit()系統調用)並調用int 0x80,它應該退出程序。 我有一個簡單的c程序運行良好,但是當我粘貼它,而不是按預期退出,我得到一個segmantation故障。爲什麼會發生?這爲什麼會導致分段錯誤?它應該只是退出

謝謝!

__asm__ ("xor %ebx, %ebx;" 
       "mov %al, 1;" 
       "int $80;" 
); 

編輯:感謝您的建議,但仍然沒有什麼,但賽格故障,但。 這裏有修改我所做的:

__asm__ ("xor %ebx, %ebx;" 
      "xor %eax, %eax;" 
       "mov $1, %eax;" 
       "int $80;" 
); 

編輯:從http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

asm("movl $1,%%eax;   /* SYS_exit is 1 */ 
      xorl %%ebx,%%ebx;  /* Argument is in ebx, it is 0 */ 
      int $0x80"   /* Enter kernel mode */ 
      ); 

修改這個例子後,這次終於爲我工作:

asm(" movl $1,%eax; 
     xorl %ebx,%ebx; 
     int $0x80 
" 
     ); 

感謝尋找並提供建議。

+2

我不知道asm,但'%al'和'eax'是一樣的嗎?爲什麼用「C」標記? – pmg 2010-09-25 21:49:51

+0

c標籤在那裏,因爲它被按原樣粘貼到c程序中,並用gcc編譯。 – healy 2010-09-25 22:03:45

+0

請嘗試'int $ 0x80'而不是'int $ 80'。我很確定十進制符號是默認值。 – AndiDog 2010-09-25 22:17:17

回答

1

這看起來像AT & T彙編語法,所以在更常用的Intel語法中,操作按照「操作源,目標」的順序而不是「操作目標,源」。

知道了這一點,mov %al, 1;試圖將al寄存器的內容寫入內存位置1.將其更改爲mov 1, %al;它應該工作IMO。請注意,我從來沒有使用AT & T語法,所以我不確定我是否正確解釋它。

編輯:和傑夫M是正確的,系統調用號碼必須存儲在eax寄存器,所以確保它被清除。

2

您確定已清除eax的其餘部分嗎?嘗試將1轉換爲eax,而不是僅將al或至少將其清除。

__asm__ ("xor %ebx, %ebx;" 
     "mov $1, %eax;" 
     "int $0x80;" 
); 

編輯:如果AndiDog是對有關AT & T語法。

編輯:這已經有一段時間,因爲我用的氣體,但80 是$0x80$80是80 。這應該修復它的最後一個。

+0

在移動系統調用(1)之前嘗試清除eax,不改變 – healy 2010-09-25 22:07:32

+0

這適用於我(x86-64/Linux,使用-m32編譯),除了它應該是「mov $ 1,%eax」而不是「mov 1,% eax「 - 後者試圖讀取地址爲00000001的內存,當然這是段錯誤。 (從技術上講,它應該是「xorl」和「movl」,但是GAS似乎無論如何都能正確實現。) – zwol 2010-09-25 22:22:57

+0

@Zack:啊,是的,謝謝你。我只是對healy的代碼做了一些調整,並忘記了語法。有一陣子了...:) – 2010-09-25 22:25:09

相關問題