簡體   English   中英

何時在擴展GCC內聯匯編中使用特定操作數約束?

[英]When to use a particular operand constraint in extended GCC inline assembly?

我很難理解何時在擴展的GCC內聯匯編中使用特定的輸入操作數約束。

例如:

int x = 42;
asm("movl %0, %%eax;"
    : /* no outputs */
    : "r"(x)
    : "%eax");

我知道"r"告訴編譯器使用寄存器保存x的值,但什么時候使用"g""m"更合適? 因為我正在使用寄存器目的地,所以使用"m"破壞這段代碼; 並且"g"對操作數約束過於“模糊”?

您使用的約束很大一部分是它所描述的類型是否可以在您所擁有的說明中使用。 mov %0, %%eax ,您可以放置​​寄存器,內存引用或立即操作數來代替%0 ,匯編器將接受它。 所以你可以使用g作為約束。

如果你有mov %0, 4(%%esp) ,則你不能允許%0作為內存引用,因為4(%%esp)是一個內存引用,並且沒有接受的mov指令形式兩個內存引用。 因此,您將需要使用諸如r的約束來要求%0作為寄存器。

(注意,這個代碼本身是沒用的。一旦asm完成,編譯器就可以自由地使用%eax來實現它所希望的任何東西,所以沒有理由期望x將保留在寄存器中。移動到%eax只能在使用%eax的指令序列中有用,然后才允許編譯器再次控制。)

暫無
暫無

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

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