【问题标题】:What will we happened when we move data from ax into a port address当我们将数据从 ax 移动到端口地址时会发生什么
【发布时间】:2012-12-08 21:09:38
【问题描述】:

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

    mov ax,1fb4h
    out 42h,al
    mov al,Ah
    out 42h,AL

好的,为什么会这样?我认为有一个覆盖,端口 42h 的最后一个值将是 AH =>1f,所以永远不会将 b4(它们的低位)保留在端口地址中! 所以我们会放松频率...

为什么我们不能使用它:

out 42h,AX

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

【问题讨论】:

  • 为什么你的手指跳到关闭按钮上?累了吗?
  • 查看pinout of the Intel 8254 并问自己为什么它不接受 16 位数据。没那么难理解!

标签: c++ assembly io x86 port


【解决方案1】:

out port,ax 将尝试写入 16 位端口。 8254 不提供 16 位端口——只有 8 位端口。

我还没有验证,但我相信如果你对端口 42 进行 16 位写入,低字节将进入端口 42,而高字节将进入端口 43。你真的不过不想这样,因为端口 43 是 PITs 命令/模式寄存器。

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

【讨论】:

  • 你的意思是如果我们使用 "out port,ax" ,端口 42 有 al 而端口 43 有 ah ?并且通过使用 4 行代码,我们不会设置 PIT ?
  • 是的,如果您尝试进行单个 16 位写入,我相信 al 会被写入 42h 和 ah 到 43h。
  • 我不太确定你在问什么。
  • 所以我们将通过 4 行代码设置 PIT ?不是42小时?我的意思是我们会做这样的事情:复制 port42,al 并立即复制 port42,ah .... 那么会发生什么,我认为频率会崩溃并错过它的低位。
  • 端口 42h(在 PC 上)映射到 PIT 的寄存器之一。您不能将 AH 直接写入端口:根本没有说明。可用的选项是 AL 和 AX(要编写 AX,您必须在 DX 中指定端口号,而不是立即数)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多