簡體   English   中英

我可以將數據推送/彈出到GCC C返回堆棧嗎?

[英]Can I push/pop data to the GCC C return stack?

在GCC C中,是否有辦法將數據推入/彈出到C返回堆棧?

我不是在談論實現自己的堆棧(我知道該怎么做)。 我的意思是使用現有的C返回堆棧顯式推入/彈出參數(當然,在同一級別的括號內)。

例如,類似:

extern int bar;

void foo(void) {
  PUSH(bar);

  bar = 12;
  doSomething(); // that depends on the value of bar

  bar = POP();   // restore original value of bar
}

如果有任何簡單的方法可以做到這一點,我認為這將是更明確地使用局部變量(例如“ oldBar”)的替代方法。

如果使用臨時變量,則基本上是同一件事。 臨時變量在堆棧上分配或優化到寄存器。

例如

extern int bar;

void foo(void) {
  int tmp = bar
  bar = 12;
  doSomething(); // that depends on the value of bar
  bar = tmp;   // restore original value of bar
}

顯然,C實際上並不需要將堆棧結構用於調用,因此此功能沒有任何意義。 本文的內存布局部分對此要求保護, 網址為https://www.seebs.net/c/c_tcn4e.html

很簡單,不是每個編譯器都有一個“堆棧”。 有些系統實際上沒有任何此類功能。 每個C編譯器都有某種處理函數調用的機制,但這並不意味着它是堆棧。 更重要的是,函數參數或局部變量不存儲在任何“堆棧”中而是存儲在CPU寄存器中是很常見的。 這種區別很重要,應該掩蓋而不是揮之不去。

從技術上講,您也可以使用alloca()(位於alloca.h中)執行此操作,但是釋放該內存的唯一方法是返回函數調用。 它也並沒有真正按照您的建議執行。 alloca也不是C標准的一部分

如果使用純C語言編寫,則可以使用可變參數函數。 當然,這不是一個完整的解決方案,因為僅在調用函數時才在函數調用后清除堆棧並推入參數。 但是,如果您需要按照說明使用它,則可能會起作用:

extern int bar;
void doSomething(...);
void foo(void) {
  doSomething(&bar);
  //you do not need here to pop to restore the bar value, as you push a copy of value
}

如果要在推送后執行其他操作(我什至無法想象),則可以使用包裝器函數。

extern int bar;
void doSomething();
void doSomethingWrapper(...) {
   //here arguments that are passed in ... are pushed
   doSomething();
   //and here they are poped
}
void foo(void) {
  //....
  doSomethingWrapper(&bar);
  //....
}

如果您只想以一種狡猾的方式操作堆棧,唯一的解決方案就是使用內聯匯編。 或者您可以調用void push(...)函數來推送所需內容,並在push()主體中使用longjmp() push()以避免控制流離開該函數時彈出參數。

好的,這就是我想要的:

#define PUSHINT(var) int old__##var = var
#define POPINT(var) var = old__##var

extern int bar;

void foo(void) {
  PUSHINT(bar);

  bar = 12;
  doSomething(); // that depends on the value of bar

  POPINT(bar);   // restore original value of bar
}

如果我可以保證每次都使用“ old__”前綴會更好,但是我不知道該怎么做(這不太可能成為問題)。

而且它並沒有真正執行PUSH / POP(盡管確實存儲在返回堆棧中,至少在我的硬件上)。 您不能推送一個值並彈出另一個值。

但是我不想一開始就這樣做。

我可以將宏重命名為SAVE()和RESTORE()...

(感謝@BobbySacamano的回答。)

暫無
暫無

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

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