2011-08-29 50 views
1

當寫入一個寄存器時,比如mov ax, 1,它會覆蓋它之前可能有的值。如何寫入CPU寄存器實際工作?

現在我想知道的是,如何將大數字/字符串輸入到寄存器中,而另一個應用程序是否可以覆蓋我的應用程序的寄存器值?我的意思是,寄存器是否在進程間共享,或者他們是否收到自己的沙箱/虛擬寄存器?

我對Intel x86(-64)核心CPU和Windows很感興趣。

+2

注意:在這個基本級別上操作系統並不重要:每個人都以同樣的方式進行操作。 –

回答

2

在單個核心上一次只安排一個線程。核心是什麼有寄存器。

當新的線程被調度時,首先保存寄存器,並且線程的先前保存的寄存器被恢復。這包括程序計數器寄存器,它指向下一條要執行的指令。


寄存器(來自存儲器):

AX,BX,CX,DX爲16位,分成字節(AH,AL,BH,BL) SI,DI,SP和BP也16位

EAX,EBX,ECX等32位

我不知道他們是所謂的64位系統上的內容。我想我看到了RAX,但我不確定。

也有特殊用途寄存器,浮點寄存器等

+0

這清理了很多。您是否碰巧知道應用於寄存器的限制 - 即數據量和類型。我很樂意採取鏈接,因爲我無法真正找到有關此英特爾文檔... – Tower

+2

如何找不到文檔? –

+1

寄存器是位,即全1,零和零。除非你和他們做些什麼,否則他們沒有任何意義。即使這樣,意義也是暫時的。假設你使用一個寄存器來存儲一個地址,對你來說它是一個地址,而坐在那裏的寄存器只是位。當您使用該寄存器時,將這些位解釋爲地址的指令,則暫時爲地址。當你需要移動該地址來指向另一個項目時,比如說* p ++,那麼現在該寄存器包含一個操作數並導致一個添加操作。 8位,16位,32位或62位。只是一點點而已。 –

2

1)寄存器的大小取決於(在良好定義的方式)你使用什麼名字他們。例如,eax是32位寬,ax是16位,並且ah/al是8位。如果您使用的是64位系統,則rax是64位寬。

這些寄存器大小的確切限制將取決於您如何解釋值(特別是,您將它們視爲有符號還是無符號)。不過,尺寸是最重要的。

2)當其他進程或內核正在運行時,操作系統內核將保存進程的寄存器。當你沒有運行時,寄存器具有其他值,但它們都是透明的 - 當你的進程正在運行時,寄存器不會從你下面改變。