当我们将数据从ax移动到端口地址时,我们会发生什么?

S.A*_*hid 0 c++ io port x86 assembly

为了将频率加载到8254芯片的计数器寄存器中,我们将频率加载到ax,然后我们将al和ah一个接一个地移动到端口#42h:

    mov ax,1fb4h
    out 42h,al
    mov al,Ah
    out 42h,AL
Run Code Online (Sandbox Code Playgroud)

好吧,为什么它有效?我认为有一个覆盖,端口42h的最后一个值将是AH => 1f,所以从来没有b4(它们的低位)将保留在端口地址中!所以我们将失去频率......

为什么我们不能使用这个:

out 42h,AX
Run Code Online (Sandbox Code Playgroud)

如果端口地址空间小于AX,那么为什么第一行代码工作以及如何工作?

Jer*_*fin 5

out port,ax将尝试写入16位端口.8254不提供16位端口 - 仅8位端口.

我还没有验证,但我相信如果你对端口42进行了16位写操作,那么低字节将转到端口42,而高字节转到端口43.你真的不希望这样,因为端口43是PITs命令/模式寄存器.

至于它为什么/如何工作:PIT内部有一个16位寄存器,但只提供一个8位端口来访问它.当您进行第一次写入时,PIT会临时锁定它.当您进行第二次写操作时,PIT也将其锁存,然后将锁存器的16位写入寄存器.