當寫入一個寄存器時,比如mov ax, 1
,它會覆蓋它之前可能有的值。如何寫入CPU寄存器實際工作?
現在我想知道的是,如何將大數字/字符串輸入到寄存器中,而另一個應用程序是否可以覆蓋我的應用程序的寄存器值?我的意思是,寄存器是否在進程間共享,或者他們是否收到自己的沙箱/虛擬寄存器?
我對Intel x86(-64)核心CPU和Windows很感興趣。
當寫入一個寄存器時,比如mov ax, 1
,它會覆蓋它之前可能有的值。如何寫入CPU寄存器實際工作?
現在我想知道的是,如何將大數字/字符串輸入到寄存器中,而另一個應用程序是否可以覆蓋我的應用程序的寄存器值?我的意思是,寄存器是否在進程間共享,或者他們是否收到自己的沙箱/虛擬寄存器?
我對Intel x86(-64)核心CPU和Windows很感興趣。
在單個核心上一次只安排一個線程。核心是什麼有寄存器。
當新的線程被調度時,首先保存寄存器,並且線程的先前保存的寄存器被恢復。這包括程序計數器寄存器,它指向下一條要執行的指令。
寄存器(來自存儲器):
AX,BX,CX,DX爲16位,分成字節(AH,AL,BH,BL) SI,DI,SP和BP也16位
EAX,EBX,ECX等32位
我不知道他們是所謂的64位系統上的內容。我想我看到了RAX,但我不確定。
也有特殊用途寄存器,浮點寄存器等
這清理了很多。您是否碰巧知道應用於寄存器的限制 - 即數據量和類型。我很樂意採取鏈接,因爲我無法真正找到有關此英特爾文檔... – Tower
如何找不到文檔? –
寄存器是位,即全1,零和零。除非你和他們做些什麼,否則他們沒有任何意義。即使這樣,意義也是暫時的。假設你使用一個寄存器來存儲一個地址,對你來說它是一個地址,而坐在那裏的寄存器只是位。當您使用該寄存器時,將這些位解釋爲地址的指令,則暫時爲地址。當你需要移動該地址來指向另一個項目時,比如說* p ++,那麼現在該寄存器包含一個操作數並導致一個添加操作。 8位,16位,32位或62位。只是一點點而已。 –
1)寄存器的大小取決於(在良好定義的方式)你使用什麼名字他們。例如,eax
是32位寬,ax
是16位,並且ah
/al
是8位。如果您使用的是64位系統,則rax
是64位寬。
這些寄存器大小的確切限制將取決於您如何解釋值(特別是,您將它們視爲有符號還是無符號)。不過,尺寸是最重要的。
2)當其他進程或內核正在運行時,操作系統內核將保存進程的寄存器。當你沒有運行時,寄存器具有其他值,但它們都是透明的 - 當你的進程正在運行時,寄存器不會從你下面改變。
注意:在這個基本級別上操作系統並不重要:每個人都以同樣的方式進行操作。 –