[英]Inline assembly in C - Understand the compilation result
我試圖了解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 )中了解了內聯匯編,所以我這樣做了解內聯匯編語法。
能否請您提示我如何完成上面編寫的結果匯編?
謝謝!
有兩個輸入操作數,並且您已經正確地處理了這兩個輸入操作數,因此開始時沒有任何遺漏。
您有一個使用約束a
輸出變量ppid
,並且您已經知道它指向eax
寄存器。 這意味着編譯器期望ppid
的值在asm塊之后的eax
。 因此,像movl %eax, ppid
類的東西,或者,如果ppid
是局部變量,那么當然要使用esp
或ebp
的正確偏移量,例如movl %eax, 4(%esp)
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.