我正在尝试模拟英特尔 8080 指令集,但我被困在这条指令上OUT D8
,根据英特尔 8080/8085 汇编语言编程一书,它说
OUT
指令将累加器的内容放在 8 位数据总线上,将所选端口的编号放在 16 位地址总线上。由于端口数的范围从 0 到 255,因此端口号在地址总线上是重复的。
问题是我不明白这是做什么的。有人可以向我解释一下,或者让我看一篇解释它的文章或一本书。
我正在尝试模拟英特尔 8080 指令集,但我被困在这条指令上OUT D8
,根据英特尔 8080/8085 汇编语言编程一书,它说
OUT
指令将累加器的内容放在 8 位数据总线上,将所选端口的编号放在 16 位地址总线上。由于端口数的范围从 0 到 255,因此端口号在地址总线上是重复的。
问题是我不明白这是做什么的。有人可以向我解释一下,或者让我看一篇解释它的文章或一本书。
一种思考方式是 8080 及其衍生产品具有 17 位地址总线,而不是通常引用的 16 位总线。该地址总线的最高位是芯片的输入/输出请求线(IORQ)。
当您使用正常加载和存储时,最高位总是被重置。当您执行输入或输出时,始终设置最高位。
英特尔命名了这条线,并希望它用于与外围芯片通信,因此得名,可用寻址的形式更加有限,访问成本更高,而且程序计数器和堆栈指针都不能指向这一点地址空间的区域。
这给英特尔留下了一个问题,即他们有 16 位地址总线要填充,但只采用了一个 8 位参数。他们实际上所做的是将累加器加载到前 8 位。所以如果你有:
LD A, 0xfe
OUT (0xdc)
然后将值 0xfe 输出到端口地址 0xfedc。
(除此之外:为 Zilog 语法而不是 Intel 道歉;可能有趣的是,Z80 添加了一堆类似OUT (C), A
这样的指令,真的将整个 BC 转储到地址总线上,而不仅仅是 C 并且大多数 Z80 微型制造商非常乐意使用完整的 16 -位地址,因为它允许他们使用“如果此地址线为低电平,则正在寻址组件”的简化逻辑,同时仍然为外部外围设备留下了不错的范围)
对于仿真,这意味着
当仿真设备中存在 IN/OUT 端口时 -
当仿真设备具有内存映射端口时,端口中有简单的 IN/OUT 数据 -
然后
是 OUT AB -> 到 STA ABAB
IN 12 -> LDAX 1212
对于硬件开发人员来说,这意味着在执行输入/输出时,地址总线具有 a15-8 = a7-a0 和 =portNum