簡體   English   中英

C語言中的內聯匯編-了解編譯結果

[英]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是局部變量,那么當然要使用espebp的正確偏移量,例如movl %eax, 4(%esp)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM