当我们将数据从 ax 移动到端口地址时会发生什么
What will we happened when we move data from ax into a port address
为了将频率加载到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,那么为什么第一行代码有效以及如何工作?
out port,ax
将尝试写入 16 位端口。8254 不提供 16 位端口 - 仅提供 8 位端口。
我还没有验证,但我相信如果你对端口 42 进行 16 位写入,低字节将转到端口 42,高字节将转到端口 43。不过,您真的不希望这样,因为端口 43 是 PIT 命令/模式寄存器。
至于它为什么/如何工作:PIT内部有一个16位寄存器,但只提供一个8位端口来访问它。执行第一次写入时,PIT 会暂时锁定它。当您进行第二次写入时,PIT 也会锁存该锁存器,然后将 16 位从锁存器写入寄存器。
相关文章:
- 当我们从/tp地址中添加/减去一个整数时会发生什么
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- 获取通用/前向引用地址有什么意义?
- 从二进制流中读取时,将双精度变量的地址转换为 char* 意味着什么?
- C++在变量的内存地址上做什么来"deallocate"它?
- 有什么方法可以识别可用的内存地址吗?
- 在C++中为零大小的分配返回唯一地址背后的基本原理是什么?
- 将指针的地址传递给需要指针到指针的函数有什么意义?
- C++ - *(int**) 地址?这里发生了什么?
- 数组的变量名和该数组的地址有什么区别?
- 是什么原因导致指定为RtlvalidateHeap的无效地址
- 在 Xcode 中工作的 CMake 中启用地址清理器的正确方法是什么
- 不太明白 & 运算符的地址在这个结构中做什么,以及它如何能够访问其他成员变量
- 当超过可能的虚拟地址数时会发生什么情况
- 数组与其地址之间的关系是什么?
- 什么是地址0xbaddc0dedeadbead "Bad decode dead bead"
- 将绝对地址强制转换为指针变量的现代C++方法是什么?
- 跳过的内存地址是什么?
- C++:维护有序的ip地址表的最快方法是什么
- 当我们将数据从 ax 移动到端口地址时会发生什么