Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 写入CPU寄存器实际上是如何工作的?_Windows_Assembly_Cpu_Intel - Fatal编程技术网

Windows 写入CPU寄存器实际上是如何工作的?

Windows 写入CPU寄存器实际上是如何工作的?,windows,assembly,cpu,intel,Windows,Assembly,Cpu,Intel,当写入寄存器时,比如说,像mov ax,1,它会覆盖先前可能具有的值 现在我想知道的是,我能将多大的数字/字符串输入到寄存器中,而另一个应用程序能覆盖我的应用程序的寄存器值吗?我的意思是,这些寄存器是在进程之间共享的,还是它们接收自己的沙盒/虚拟寄存器 我对Intel x86(-64)核CPU和Windows很感兴趣。单核上一次只能调度一个线程。核心是什么有寄存器 调度新线程时,首先保存寄存器,然后恢复该线程以前保存的寄存器。这包括程序计数器寄存器,它指向要执行的下一条指令 寄存器(来自内存)

当写入寄存器时,比如说,像
mov ax,1
,它会覆盖先前可能具有的值

现在我想知道的是,我能将多大的数字/字符串输入到寄存器中,而另一个应用程序能覆盖我的应用程序的寄存器值吗?我的意思是,这些寄存器是在进程之间共享的,还是它们接收自己的沙盒/虚拟寄存器


我对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,但我不确定


还有专用寄存器、浮点寄存器等。

单核上一次只调度一个线程。核心是什么有寄存器

调度新线程时,首先保存寄存器,然后恢复该线程以前保存的寄存器。这包括程序计数器寄存器,它指向要执行的下一条指令


寄存器(来自内存):

AX、BX、CX、DX是16位,分为字节(AH、AL、BH、BL) SI、DI、SP和BP也是16位

EAX、EBX、ECX等为32位

我不确定它们在64位系统上被称为什么。我想我看到了RAX,但我不确定

还有专用寄存器、浮点寄存器等。

1)寄存器的大小(以明确定义的方式)取决于您为它们使用的名称。例如,
eax
是32位宽,
ax
是16位,
ah
/
al
是8位。如果您使用的是64位系统,
rax
的宽度为64位

这些寄存器大小的确切限制在某种程度上取决于您如何解释这些值(特别是,您是将它们视为有符号还是无符号)。不过,规模才是最重要的

2) 当其他进程或内核运行时,操作系统内核将保存进程的寄存器。当您不运行时,寄存器会接受其他值,但它是透明的——当您的进程运行时,寄存器不会从您的下面更改。

1)寄存器的大小取决于(以明确定义的方式)您为它们使用的名称。例如,
eax
是32位宽,
ax
是16位,
ah
/
al
是8位。如果您使用的是64位系统,
rax
的宽度为64位

这些寄存器大小的确切限制在某种程度上取决于您如何解释这些值(特别是,您是将它们视为有符号还是无符号)。不过,规模才是最重要的


2) 当其他进程或内核运行时,操作系统内核将保存进程的寄存器。当您不运行时,寄存器会接受其他值,但它是透明的——当您的进程运行时,寄存器不会从您的下面更改。

这就清除了很多。您知道应用于寄存器的限制吗?例如,有多少数据和什么类型。我很乐意提供链接,因为我真的找不到关于这个的英特尔文档…你怎么能找不到文档?寄存器是位,也就是全部,1和0。除非你对它们做点什么,否则它们没有意义。即使如此,其意义也是暂时的。假设你正在使用一个寄存器来存储一个地址,对你来说它是一个地址,而坐在那里的寄存器只是位。当您将该寄存器与一条将这些位解释为地址的指令一起使用时,那么它暂时是一个地址。当您需要将该地址移动到另一个项目时,例如*p++,现在该寄存器包含一个操作数和一个加法运算的结果。8、16、32或62位。只保留位。@rFactor:寄存器保存位,而不是数据类型。寄存器包含8位、16位、32位或64位。这就清除了很多。您知道应用于寄存器的限制吗?例如,有多少数据和什么类型。我很乐意提供链接,因为我真的找不到关于这个的英特尔文档…你怎么能找不到文档?寄存器是位,也就是全部,1和0。除非你对它们做点什么,否则它们没有意义。即使如此,其意义也是暂时的。假设你正在使用一个寄存器来存储一个地址,对你来说它是一个地址,而坐在那里的寄存器只是位。当您将该寄存器与一条将这些位解释为地址的指令一起使用时,那么它暂时是一个地址。当您需要将该地址移动到另一个项目时,例如*p++,现在该寄存器包含一个操作数和一个加法运算的结果。8、16、32或62位。只保留位。@rFactor:寄存器保存位,而不是数据类型。寄存器包含8位、16位、32位或64位。注意:在这个基本级别上,操作系统并不重要:每个人都以相同的方式操作。注意:在这个基本级别上,操作系统并不重要:每个人都以相同的方式操作。