assembly - 8086 assembly 相关问题

标签 assembly x86-16

这可能是非常基本的,但我无法真正理解。

我正在使用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 个字节的版本( 编程只是喜欢节省空间)是:

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/

相关文章:

x86 - FPGA实现8086处理器的最低要求

assembly - 为什么汇编语言运算时要在字符串后面加-2?

c - 从程序集访问 C 指针

assembly - *%gs :0x10 do in assembler? 是什么意思

nasm - ORG指令后设置段寄存器

performance - 为什么远指针很慢?

c - 为什么编译器在这种情况下使用 32 位寄存器将指针传递给 amd64 linux 上的函数

无法在内联汇编中声明 .data

assembly - x86 MASKMOVDQU 指令的所有 16 个字节都必须是有效内存吗?

assembly - Hook Int 09h 中断