為什麼不把push ebp和mov ebp, esp的操作通過硬體方式做進call指令中?

時間 2021-05-05 18:17:42

1樓:out4b

不是所有的runtime都需要遵循這樣的C-like calling convention的,所以合起來也沒太大意義。比方從JVM JIT emit出來的code就不一定需要。Calling convention只要JIT和runtime自己認識,自己能做stack unwinding就行了。

2樓:菜夢

如果要將 push ebp/push ebp, esp 組合嵌入到 call 指令裡,並不是乙個好的設計

(1)相當於 ebp 暫存器,專用化了。

儘管,ebp 最初的目的確實是用來儲存 stack frame 的。但是,在 x86 架構通用暫存器本來就很吃緊的情況下,這顯然十分的不好。

事實上,有不少情況下ebp 都用來作為通用暫存器的。有些子過程,你完全可以不需用 ebp 來儲存 stack frame,從而節省了乙個暫存器。

(2)不靈活,需要考慮其他很多引發的問題。

如果 call 嵌入 push ebp/push ebp, esp 組合。那麼,ret 指令怎麼辦?

是不是 ret 指令也要嵌入 mov esp, ebp / pop ebp 組合呢?

別外,需要切換特權級別時候怎麼辦?

例如:call 乙個呼叫門,從 ring 3 進入 ring 0 ,有乙個許可權的切換,這時候怎麼辦?會不會有漏洞?

esp 暫存器有乙個重要地方,它的 RPL 代表著 cpu 當前的執行許可權級別:0 ~3,

所以。對於這方面來說,是乙個需要考慮的問題。

3樓:「已登出」

首先你要明白為什麼需要使用

push ebp

mov ebp ,esp 作為函式開頭?

以我的理解,函式以ebp用來定位引數和區域性變數

比如ebp+4指向返回位址

ebp+8指向引數一

ebp-4指向區域性變數一。

那麼為什麼不使用esp而使用ebp呢?因為每一次push pop call等指令都會使得esp的改變(只要有入棧和出棧都會改變esp)

以x86 32位彙編為例子

push eax 指令的本質就是把eax的值壓入棧,並且讓esp的值減4

pop eax 指令的本質就是把目前esp指向的記憶體的4位元組的值賦值給eax,並且讓esp的值加4

call 指令的本質是把返回位址壓棧,然後jmp到函式開頭。

以我做反彙編的經驗來看,函式執行過程中,涉及到呼叫另乙個函式,會使得esp的值改變,而且傳參不一定是一次性push完所有引數,中間可能夾帶著操作呼叫者函式的引數或區域性變數的指令,這時就很難使用esp定位呼叫者的引數和區域性變數了,硬要使用esp定位,估計寫編譯器的準備跑路了。

有很多函式是不以

push ebp

mov ebp,esp開頭的

比如vs2017中的memcpy就不是,而是直接使用esp定位引數,換句話說,這只是編譯器的習慣罷了,為啥要求cpu廠商去相容一種習慣?我哪怕把ebp換成別的暫存器也行。intel新增指令不被人噴死?

某程式設計師:「我編寫的程式為什麼不能在舊cpu上執行?」

4樓:波波

如果不是為了除錯方便,stack frame是不需要儲存的,而且沒人規定stack frame一定儲存在ebp裡。一條指令幹一大堆事情,並且使用固定的暫存器這種做法早就過時了。

5樓:靈劍

Intel家的現代CPU設計是超越我們在書本上學到的那些知識的,有很多黑科技在裡面,比如說它的解碼過程是可以一次翻譯很多指令然後多發射/亂序執行的。如果它想要將這三條指令變成乙個過程,它完全可以做到在解碼的時候將它翻譯成單條微指令,所以並沒有什麼特別的必要來引入乙個新指令。

為什麼this war of mine不把背景設定為軍力碾壓的戰勝國?這遊戲的本質是不是反戰敗?

孫克儉 說實話,你的思想很危險!二戰前期日本國民的思想就是通過戰爭把國內的矛盾轉移到國外,提公升本國生活質量 然後戰敗了就各種反思戰爭後期的國民生活如何差,那是真的反戰麼? Chris Tinman 神經病問題,波赫戰爭是內戰,內戰哪他媽的有勝利,打死的每乙個人,打壞的每一件東西都是淨損失。在校生不...

為什麼五菱巨集光MINI EV會比特斯拉Model 3賣得好?

Happylion 我是一名Model 3車主,也體驗過五菱巨集光MINI EV 以下簡稱Mini EV 作為電動車,Model 3動力強勁,開起來也比油車輕鬆太多,估計我以後都不想再開油車,21款標準版續航468公里,只要不開長途,足夠用了。雖然從硬體配置和駕駛體驗上來說,Mini EV無論在哪個...

為什麼賈伯斯和庫克不把 iPhone 的電池做到 5000 毫安?

楊智浩 如何增大電池電量?1.增加能量密度 Galaxy Boom7剛過了一年多,三星因為增大了一點電池能量密度就在全球各地放起了炮。化學這個東西,變一點都可能會引起質變,掌握不好脾氣,穩妥為好。在成熟的量產技術出現之前,還是悶聲發大財吧。所以此方案直接Pass。2.增大電池體積 這個方案比前乙個方...