我想了解什麼會在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)中的內聯彙編,所以我理解內聯彙編語法。
你能給我一個提示如何完成我上面寫的結果彙編?
謝謝!
所以當你寫「int ppid」時,編譯器不會生成任何操作寄存器的彙編代碼? – SyndicatorBBB 2015-04-04 12:46:05
不是這樣,不,但是在函數開始時它將爲所有局部變量分配空間。所以從這個意義上說,是的,在開始時有一些東西,即'subl $ 4,%esp',其中分配的金額取決於所有局部變量的大小以及平臺的對齊要求。 – Jester 2015-04-04 12:50:04
非常感謝! – SyndicatorBBB 2015-04-04 16:47:45