Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.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
Assembly IDE磁盘控制器';读写共享一个寄存器时,s寄存器混淆?_Assembly_Io_X86_Disk - Fatal编程技术网

Assembly IDE磁盘控制器';读写共享一个寄存器时,s寄存器混淆?

Assembly IDE磁盘控制器';读写共享一个寄存器时,s寄存器混淆?,assembly,io,x86,disk,Assembly,Io,X86,Disk,IDE PATA接口:0x1F7寄存器在读取时用作状态寄存器,在写入时用作命令寄存器 但如果我首先写一个命令(即0x20)来告诉设备我想向它写一些东西,那么下一条指令我读取reg来查找状态。该寄存器上的位是否仍可能是0x20而不是我想要的状态位?尽管端口地址相同,但内部有两个寄存器,一个命令寄存器和一个状态寄存器。输出指令写入命令寄存器,输入指令从状态寄存器读取。虽然端口地址相同,但内部有两个寄存器,一个命令寄存器和一个状态寄存器。输出指令写入命令寄存器,输入指令从状态寄存器读取。I/O端口与正

IDE PATA接口:0x1F7寄存器在读取时用作状态寄存器,在写入时用作命令寄存器


但如果我首先写一个命令(即0x20)来告诉设备我想向它写一些东西,那么下一条指令我读取reg来查找状态。该寄存器上的位是否仍可能是0x20而不是我想要的状态位?

尽管端口地址相同,但内部有两个寄存器,一个命令寄存器和一个状态寄存器。输出指令写入命令寄存器,输入指令从状态寄存器读取。

虽然端口地址相同,但内部有两个寄存器,一个命令寄存器和一个状态寄存器。输出指令写入命令寄存器,输入指令从状态寄存器读取。

I/O端口与正常内存位置不同。读和写是独立的事务;前一个完成后才能开始。(这是编程IO如此缓慢的部分原因)。此外,正如@rcgldr所解释的,在本例中,两个寄存器恰好共享相同的端口号,但由于一个是只读的,另一个是只读的,因此它们通过“方向”消除了歧义

事实上,每次读取都保证是单独可见的:例如,从同一IO端口重复读取可能会从硬件缓冲区提供数据。(事实上,这就是PIO代替DMA读取读取请求的数据响应的工作原理。)因此,从同一寄存器读取的每个数据都可能产生副作用,而硬件的设计必须考虑到这一点

这种独立的事务处理甚至适用于不可缓存内存(物理地址空间)中的MMIO寄存器,而不仅仅是IO地址空间(可通过
in
/
out
指令访问)-将其映射为不可缓存可确保CPU不会在内部执行存储->加载转发。但对于
in
/
out
指令,这绝对不会发生。(与输入/输出不同,MMIO允许一些流水线,但每个CPU写入和读取都保证对硬件单独可见。)

I/O端口与普通内存位置不同。读和写是独立的事务;前一个完成后才能开始。(这是编程IO如此缓慢的部分原因)。此外,正如@rcgldr所解释的,在本例中,两个寄存器恰好共享相同的端口号,但由于一个是只读的,另一个是只读的,因此它们通过“方向”消除了歧义

事实上,每次读取都保证是单独可见的:例如,从同一IO端口重复读取可能会从硬件缓冲区提供数据。(事实上,这就是PIO代替DMA读取读取请求的数据响应的工作原理。)因此,从同一寄存器读取的每个数据都可能产生副作用,而硬件的设计必须考虑到这一点


这种独立的事务处理甚至适用于不可缓存内存(物理地址空间)中的MMIO寄存器,而不仅仅是IO地址空间(可通过
in
/
out
指令访问)-将其映射为不可缓存可确保CPU不会在内部执行存储->加载转发。但对于
in
/
out
指令,这绝对不会发生。(MMIO与in/out不同,它允许一些流水线,但每个CPU的写入和读取都保证对硬件是单独可见的。)

它确实帮助我更好地理解它。它确实帮助我更好地理解它。你说过“在前一个完成之前无法启动”,所以在我向状态端口写入命令的情况下,然后下一条指令是我从端口读取的,我会得到我之前写入的命令的状态,还是其他命令留下的状态。你说“前一个命令完成后才能启动”,所以在我向状态端口写入命令的情况下,然后下一条指令是我从端口读取的,我将获得我之前编写的命令的状态,还是其他命令留下的状态。