2015-04-04 60 views
0

我想了解什麼會在C以下代碼的編譯結果:內聯彙編用C - 瞭解編譯結果

int ppid; 
#define SYS_getppid 23 
asm volatile("int %1" : "=a" (ppid) : "i" (T_SYSCALL), "a" (SYS_getppid)); 

哪裏T_SYSCALL是恆定的64

這我到目前爲止:

?       // I know something is missing here but I'm not sure what it is 
mov $(SYS_getppid), %eax  // "a" (SYS_getppid) 
int $(T_SYSCALL)    // T_SYSCALL = 64 in xv6 
?       // I know something is missing here but I'm not sure what it is 

我不知道如何處理ppid變量。在聲明時我應該在哪裏保存它,以及如何在內聯彙編代碼的結果中爲這個變量賦值(我想我應該在某處使用間接尋址)。

注意我試圖使用GCC編譯器爲了創建一個彙編文件出c文件,但結果太複雜,我不知道我是否理解正確(我試圖拿出最簡單的編譯結果)。

另外我讀了關於GNU網站(https://gcc.gnu.org/onlinedocs/gcc/Using-Assembly-Language-with-C.html#Using-Assembly-Language-with-C)中的內聯彙編,所以我理解內聯彙編語法。

你能給我一個提示如何完成我上面寫的結果彙編?

謝謝!

回答

1

有兩個輸入操作數,並且您已正確處理它們兩個,所以在開始時沒有任何丟失。

您有一個輸出變量ppid,它使用約束條件a並且您已經知道是指eax寄存器。這意味着編譯器希望ppid的值在asm塊後面的eax之內。因此,類似於movl %eax, ppid或者ppid是局部變量,那麼當然使用來自espebp的正確偏移,例如movl %eax, 4(%esp)

+0

所以當你寫「int ppid」時,編譯器不會生成任何操作寄存器的彙編代碼? – SyndicatorBBB 2015-04-04 12:46:05

+0

不是這樣,不,但是在函數開始時它將爲所有局部變量分配空間。所以從這個意義上說,是的,在開始時有一些東西,即'subl $ 4,%esp',其中分配的金額取決於所有局部變量的大小以及平臺的對齊要求。 – Jester 2015-04-04 12:50:04

+1

非常感謝! – SyndicatorBBB 2015-04-04 16:47:45