2012-04-18 206 views
2
int main() 
{ 
    __asm__("movl $0x1,%%eax; 
      movl $0x0,%%ebx; 
      int $0x80; 
      ":::"eax","ebx"); 
} 

我嘗試在Linux中模擬exit()的行爲。但在現代Linux中,我發現這樣做很困難,因爲一些退出處理程序將在exit()之後被調用。 所以我寫了一箇舊版本的exit()。也許10年前你可以在一些代碼中找到它。 我用gcc編譯它。有關GCC內聯彙編的奇怪的錯誤消息

gcc -o exit exit.c 

它給了我這些信息。

exit.c: In function ‘main’: 
exit.c:3:13: warning: missing terminating " character [enabled by default] 
exit.c:3:5: error: missing terminating " character 
exit.c:4:13: error: expected string literal before ‘movl’ 
exit.c:6:27: warning: missing terminating " character [enabled by default] 
exit.c:6:13: error: missing terminating " character 

我仔細檢查了我的代碼,我不認爲我的代碼是錯誤的。那是什麼?

回答

5

你不能有嵌入的換行符引用的字符串

// bad 
"two 
lines" 

重寫內爲

// good 
"two\n" 
"lines" 

預處理器將加入串無縫連接,以

"two\nlines" 
+0

非常感謝。也許我的一些閱讀材料會犯一些錯誤。 – 2012-04-18 08:42:16

1

從我記得的內聯彙編中,你可能需要用分號或類似的東西來終止每行\n\t

澄清:
只用內聯彙編終止每條線,這是不夠的,用;。內聯彙編通過gcc作爲字符串直接提供給彙編程序。如果你沒有用\n來終止每行,那麼彙編器將得到像movl $0x1,%%eax;movl $0x0,%%ebx;這樣的字符串,它將不能被解析。您可能不需要再使用\n\t,因爲gcc可以處理彙編文件,其中命令前面沒有\t

+0

是的,你是對的。但是; \ n \ n \ t都可以。 – 2012-04-18 08:37:41