8086为了区分访问内存和外设,硬件上有一个专门的引脚M/IO,指令集中则为访问外设单独提供了in/out指令。
《x86汇编---VGA显示》中为了关闭光标显示,有如下代码,这两行代码读取外设CRTC数据寄存器中的数据。
其中0x3D5为外设端口地址
为什么要按照上述书写呢?如下几种修改办法是否可以呢?
1、是否可以直接用in al,0x3D5读外设?
2、dx为通用寄存器,这里外设地址是否可以用其它通用寄存器,比如cx存储?
3、读入的数据必须存放到al中吗?cl可以吗?
结论是不行!为什么呢?
其实intel官方文档中已经描述的非常的清楚了,就如下6种情况(一定要多读官方文档)可以很清晰看到:
1、直接用外设端口地址的话,只支持1个字节,即imm8;---------- 修改1不行,0x3D5为2个字节
2、如果用通用寄存器存地址,只支持DX;--------- 修改2不行
3、读入的数据只能放到AL、AX、EAX;--------- 修改3不行
多说两句:
通用寄存器并不通用,我们常说AX,BX,CX,DX为通用寄存器。但实际上芯片设计时,很多指令能操作的寄存器是有限制范围的。
多读官方文档手册 |