2011-08-29 27 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)当其他进程或内核正在运行时,操作系统内核将保存进程的寄存器。当你没有运行时,寄存器具有其他值,但它们都是透明的 - 当你的进程正在运行时,寄存器不会从你下面改变。