这可能是非常基本的,但我无法真正理解。
我正在使用8255的A和B端口输入一个单词。我有类似的东西:
PORT_A EQU 0008h // inputs low byte
PORT_B EQU 000Ah // inputs high byte
稍后在代码段中,我有一个部分可以执行此操作:
MOV DX, PORT_B
IN AL, DX
MOV AH, AL
MOV DX, PORT_A
IN AL, DX
MOV DX, AX
我有几个问题。 MOV DX, PORT_B
的有效作用是什么?它是否在DX中存储PORT_B的地址?为什么要在AL中输入B的高字节,然后将AL移至AH,而不是简单的写成IN AH, DX
?
如何为端口 A 和 B 的地址做出明智的选择“0008h”和“000Ah”?我只使用过 8085 组件,如果我之前选择了 0008h (0000 0000 0000 1000b),我不会选择 000A (0000 0000 0000 1010b),因为 A3 位重叠(例如,我' d 选择 0001h (... 0001b) 和 0002h (.... 0010b),这样就不会出现位重叠)。
最佳答案
I'm using 8255's A and B ports to input a word
然后您将从 8255 的 A 端口获取该字的低字节,并从 8255 的 B 端口获取该字的高字节。
要从任何端口获取任何内容,我们首先将 I/O 端口的地址移动到 DX
寄存器中。然后,我们使用 in
指令来实际获取内容。这可以是:
- 当我们在 al, dx 中使用
时是一个字节
- 当我们在 ax, dx 中使用
时的一个词
- 当我们在 eax, dx 中使用
时为双字
这些是 I/O 端口in
唯一可能的目的地。 (AH
不是一个选项!)
wallyk对您提供的代码进行评论做得很好。所以我认为您已经了解原因和方式。
<小时/>我想补充的是,这段代码是可以优化的。
PORT_A EQU 0008h // inputs low byte PORT_B EQU 000Ah // inputs high byte
鉴于上述端口地址,有一种更直接的方法来完成读取单词的任务。对于适合单个字节的 I/O 地址(从 0000h 到 00FFh),根本不需要使用 DX 寄存器。这些端口地址可以在in
指令本身中指定。
这使得代码大小相当小:
IN AL, PORT_B ; Fetch high byte from port B
MOV DH, AL ; Becomes high byte of end result in DX
IN AL, PORT_A ; Fetch low byte from port A
MOV DL, AL ; Becomes low byte of end result in DX
仍然缩短 1 个字节的版本(8086 编程只是喜欢节省空间)是:
IN AL, PORT_B ; Fetch high byte from port B
MOV AH, AL ; Store in AH for now
IN AL, PORT_A ; Fetch low byte from port A
XCHG DX, AX ; Transfer AX to end result in DX
关于assembly - 8086 assembly 相关问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44027529/