簡體   English   中英

我可以將 rsp 用作通用寄存器嗎?

[英]Can I use rsp as a general purpose register?

有人告訴我,如果我使用rsp作為通用寄存器,操作系統可能會將寄存器轉儲到它在中斷的情況下指向的位置,從而導致有問題的行為。

這是真的嗎?如果不是,如果我不需要堆棧,我可以使用rsp作為通用寄存器嗎?

編輯:在用戶空間中運行。

如果發生中斷,你不會搞砸嗎?

那些在 DOS 中編程的人此時可能對中斷的可能性感到不安。 通常,像這樣重用堆棧指針是一個非常糟糕的主意,因為您不知道何時可能發生中斷,而當中斷發生時,CPU 會盡職盡責地將當前程序計數器和標志壓入堆棧。 如果您重用了 ESP,這將導致隨機數據結構被丟棄。 在這種環境中,ESP 必須始終指向有效且足夠的堆棧空間來服務中斷,並且每當這不成立時,必須禁用中斷。 在長時間禁用中斷的情況下運行會降低系統響應能力(丟失中斷和糟糕的延遲),並且對於大型例程來說是不切實際的。

但是,我們在這里以保護模式運行。

在 Win32 的用戶空間中運行時,中斷不會推送到用戶堆棧上,而是推送到內核堆棧上。 如果您考慮一下,則不可能使用用戶堆棧。 如果線程的堆棧空間不足,或者甚至只是有一個無效的堆棧,當 CPU 嘗試推送 EIP 和 EFLAGS 時,就會出現頁面錯誤,並且您不能在中斷處理程序中出現頁面錯誤。 因此,調度程序可以在無堆棧例程運行時進行任意數量的上下文切換,並且任何指向 ESP 的數據結構都不會受到影響。

來自http://www.virtualdub.org/blog/pivot/entry.php?id=85

是的,您可以在非常受控的情況下,但實際上只使用 SSE2 和/或 MMX。


相關: 在ESP下面寫是否有效? 討論 Windows 中可以異步使用 32 位代碼中的堆棧指針的內容。 使用無效的堆棧指針,這些東西會崩潰而不是踩到它下面的空間。 (或者,如果指向可寫內存,請將其用作堆棧空間。)

在 GNU/Linux 中,信號處理程序可以異步使用用戶空間堆棧指針,但您可以使用sigaltstack / SA_ONSTACK為它們使用備用堆棧。


另請注意, x86-64 保證 SSE2 如果您已經使用了所有 xmm0..15 (SSE) 和 mm0..7 (MMX),您通常只需要考慮使用 RSP 作為第 16 個通用寄存器。

對於沒有 MMX 的 CPU,在 32 位 DSP 代碼中使用 ESP 作為第 8 個通用寄存器有時是有意義的; 這就是為什么可以在 virtualdub 過濾器的上下文中找到有關它的討論。

它在 64 位代碼中通常沒有意義,因為您總是有 16 個 128 位 SIMD 寄存器(以及用於它們的 SIMD 指令) ,以及兩倍多的非堆棧指針整數寄存器。 以及 8x 64 位 mmx 寄存器或 8x 80 位 x87 寄存器,無論您想使用它們。 在大多數調用約定中,這些寄存器中的大多數都是調用破壞的,但是無論如何您都無法在 RSP 不指向堆棧的情況下進行函數調用。

暫無
暫無

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

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