2011-12-26 86 views
3

在閱讀關於程序計數器時,我發現程序計數器是特殊的,因爲沒有辦法直接修改它的值。是否可以修改或訪問程序計數器?

是否有任何間接方式來訪問/修改程序計數器的內容?

+1

嗯,跳躍怎麼樣? – 2011-12-26 11:17:51

+0

SO會跳轉,你可以訪問PC嗎? – 2011-12-26 11:22:16

+3

你在說什麼處理器? 86? MIPS?臂? ... – 2011-12-26 12:29:26

回答

9

你必須明白,如果你修改PC,下一條執行的指令將是新的PC地址。這只是無條件的跳轉,所有處理器都有這樣的指令。

通常沒有LD PC,addr指令,但這正是JMP addr所做的,所以不能直接修改其值。但是,您不能修改其值而不修改代碼的執行路徑 - 從指定的地址繼續執行。

在大多數情況下,也可以通過將堆棧指針設置爲包含新地址的位置並調用RET返回指令來間接完成此操作。

不同的處理器和體系結構在許多方面可能會有不同的表現,而我上面提到的指令助記符是「通用的」,並不是指任何特定的指令集。

+0

+1。您可能會補充說,'call'指令修改它,就像條件跳轉一樣。你可以做'jmp eax'(跳轉到EAX指向的地址)和'jmp [eax]'來跳轉到存儲在EAX指向的內存中的地址。而x86上的int指令就像是一個'call'。很多方法來修改程序計數器。 – 2011-12-26 17:07:23

+1

@Jim:這是真的,但無條件跳轉修改了PC並且不做任何其他*。最終每條指令都可以修改PC,即使它只是增加它。我試圖成爲非架構/指令集特定的,而不是詳細討論尋址模式;我的* addr *參數旨在表示任何有效的地址表示或尋址模式,包括寄存器間接尋址。阿米特必須指定他想要更具體的答案的架構。 – Clifford 2011-12-26 22:37:54

4

無條件跳轉指令直接修改PC的值。

相關問題