早在單任務奧賽斯的舊時代,這可以讓你的程序的執行方式的唯一的東西是中斷。現在,中斷處理程序有你在談論同樣的問題,你的程序計算的東西,用戶按下一個鍵 - 中斷 - 中斷服務程序有做了一些工作,但不得修改單個寄存器的過程中。這是主要原因,堆棧是首先發明的。通常一個80x86的DOS中斷服務程序應該是這樣的:
push ax
push cx
push dx
push bx
push si
push di
push bp
// no need to push sp
[do actual work, caller registers avaiable on stack if needed]
pop bp
pop di
pop si
pop bx
pop dx
pop cx
pop ax
iret
這是即使如此普遍,一個新的指令對pusha
和popa
(推送/彈出所有)的設立是爲了緩解這個任務。
在當今的CPU與操作系統和應用程序之間的地址空間隔離,CPU提供一些任務狀態系統,並允許操作系統切換任務(中斷可能仍然工作類似於上述概述,但也可以通過任務交換)。所有現代操作系統都使用這種任務狀態系統,其中CPU在進程未被主動執行時保存所有進程的寄存器。就像Jester已經解釋的那樣,gdb
只是詢問操作系統有關要調試的進程上的這些值,然後將其打印出來。
好概念的問題。在學習彙編時,一定要看看如何調用'call stack'和'instruction pointer'。 _一種使用寄存器的方法,並且仍然知道它們的作用是在更改它們之前將它們推入堆棧。因爲您知道您在堆棧中推送了多少字節,所以您甚至可以在開始更改內容之前推斷堆棧指針的內容。但是,許多CPU都有一條快速指令將所有寄存器複製到緩衝區或從緩衝區複製。主要用於交換進程,因此CPU和寄存器可以共享,但調試器也可以這樣做。 –