编辑“︁
Intel 8080
”︁
跳转到导航
跳转到搜索
Template:Editnotice load/content
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
{{Noteta | G1 = it }}{{Multiple issues| {{Expand language|1=en|time=2020-08-05T06:52:13+00:00}} {{Unreferenced|time=2020-08-05T06:54:44+00:00}} }} {{Infobox CPU|name=Intel 8080|image=Intel 8080 open-closed.jpg|caption=封装和裸露状态的Intel 8080处理器|produced-start={{Start date and age|1974|04}}|produced-end={{Start date and age|1990}}<ref>{{cite web |title=CPU History – The CPU Museum – Life Cycle of the CPU |url=http://www.cpushack.com/life-cycle-of-cpu.html |archive-url=https://web.archive.org/web/20100116143420/http://www.cpushack.net/life-cycle-of-cpu.html |archive-date=January 16, 2010}}</ref>|slowest=2|slow-unit=MHz|fastest=3.125|fast-unit=MHz|fsb-slowest=|fsb-fastest=|fsb-slow-unit=|fsb-fast-unit=|hypertransport-slowest=|hypertransport-fastest=|hypertransport-slow-unit=|hypertransport-fast-unit=|qpi-slowest=|qpi-fastest=|qpi-slow-unit=|qpi-fast-unit=|dmi-slowest=|dmi-fastest=|dmi-slow-unit=|dmi-fast-unit=|size-from=[[6 µm process|6 µm]]|size-to=|soldby=[[Intel]]|designfirm=Intel|manuf1=Intel|core1=|sock1=[[Dual in-line package|DIP40]]|pack1=40-pin [[Dual in-line package|DIP]]|brand1=|arch=8080|microarch=|instructions=|transistors=4,500 or 6,000<ref>Lewnes, Ann, "The Intel386 Architecture Here to Stay", Intel Corporation, Microcomputer Solutions, July/August 1989, page 2</ref>|extensions=|data-width=[[8-bit computing|8 bits]]|address-width=16 bits|virtual-width=|cpuid=|code=|numcores=1|l1cache=|application=|predecessor=[[Intel 8008]]|successor=[[Intel 8085]]|variant=|pcode=|support status=Unsupported}}[[File:Intel C8080A 9064 33001 N8384 top.jpg|thumb|right|250px|Intel 8080處理器]] 英特尔8080[[微处理器]]是[[英特尔]]设计和制造的第二款[[8位元|8位]][[微处理器]]。它于1974年4月首次亮相,是早期[[Intel 8008|8008]]设计的扩展和增强版本,尽管它们之间没有二进制兼容性。最初规定的[[时钟频率]]或频率限制为2 [[MHz]],常见指令使用4、5、7、10或11个周期。因此,该处理器能够每秒执行数十万条指令。后来推出了两个更快的变种,8080A-1和8080A-2,它们的时钟频率限制分别为3.125 MHz和2.63 MHz。<ref>{{Cite web|title=8080A/8080A-1/8080A-2 8-Bit N Channel Microprocessor|url=http://www.elektronikjk.com/technika_komputerowa/CPU/Intel_8080A.pdf|url-status=live|archive-url=https://web.archive.org/web/20211115165927/http://www.elektronikjk.com/technika_komputerowa/CPU/Intel_8080A.pdf|archive-date=November 15, 2021|access-date=November 16, 2021}}</ref> 8080在大多数应用中需要两个支持芯片才能工作:i8224时钟生成器/驱动器和i8228总线控制器。它采用[[N型金属氧化物半导体逻辑]](NMOS)实现,使用非饱和[[增强模式]]晶体管作为负载<ref>similar to ''[[Pull-up resistor|pull-up resistors]]''</ref><ref>{{cite book|last=Tohya|first=Hirokazu|title=Switching Mode Circuit Analysis and Design: Innovative Methodology by Novel Solitary Electromagnetic Wave Theory|date=2013|publisher=Bentham Science Publishers|isbn=9781608054497|page=4|url=https://books.google.com/books?id=ILceDgAAQBAJ&q=8080+non-saturated+enhancement&pg=PA4|language=en|access-date=November 28, 2020|archive-date=November 15, 2021|archive-url=https://web.archive.org/web/20211115163542/https://books.google.com/books?id=ILceDgAAQBAJ&q=8080+non-saturated+enhancement&pg=PA4|url-status=live}}</ref>,因此除了主要的[[晶体管-晶体管逻辑]](TTL)兼容的+5 [[Volts|V]]外,还需要+12 V和-5 V的电压。 尽管早期的微处理器通常用于如[[计算器]]、[[收銀機|收银机]]、[[终端器|计算机终端]]、[[工业机器人]]等大批量生产的设备中<ref>The [[Intel 8008|8008]] (1972) was used for interpolation and control in ASEA's (now ABB) first line of general industrial robots, introduced October 1973.</ref>,8080在更广泛的应用中取得了更大的成功,它在很大程度上被认为是[[微型计算机]]行业的起点。<ref>{{cite book|last1=Mueller|first1=Scott|title=Upgrading and Repairing PCs|date=2006|publisher=Pearson Education|isbn=978-0-7897-3404-4|page=37|edition=17th|url=https://www.informit.com/articles/article.aspx?p=482324&seqNum=2|access-date=November 16, 2021|archive-date=November 16, 2021|archive-url=https://web.archive.org/web/20211116001341/https://www.informit.com/articles/article.aspx?p=482324&seqNum=2|url-status=live}}</ref> 其受欢迎的几个因素包括:其40脚封装比18脚的8008更易于接口,并且使其数据总线更高效;其NMOS实现使其晶体管比[[P型金属氧化物半导体逻辑]](PMOS)的8008更快,同时通过使其与[[TTL电路|TTL]]兼容简化了接口;可用的支持芯片种类更多;其指令集相对于8008有所增强<ref>The enhancements were largely based on customer feedback and Federico Faggin and others listening to minicomputer-oriented professionals about certain problems and lack of features in the 8008 architecture. (Source: 8008 and 8080 oral histories.)</ref>;以及其完整的16位地址[[总线]](相对于8008的14位)使其能够访问64 KB的内存,是8008范围的四倍。它被用于[[Altair 8800]]和后续的[[S-100总线]]个人计算机,直到被[[Zilog Z80|Z80]]取代,并且是由Gary Kildall开发的[[CP/M|CP/M操作系统]]的原始目标CPU。 8080直接影响了后来的[[X86架構|x86架构]]。英特尔设计了8086,使其[[汇编语言]]与8080足够相似,大多数指令可以直接映射到彼此上,这样就可以在8086上执行转译的8080汇编代码。<ref>{{cite journal |last1=Mazor |first1=Stanley |date=June 1978 |title=The Intel 8086 Microprocessor: a 16-bit Evolution of the 8080 |url=https://ieeexplore.ieee.org/document/5430762 |url-status=live |journal=IEEE Computer |volume=11 |issue=6 |pages=18–27 |doi=10.1109/C-M.1978.218219 |s2cid=16962774 |archive-url=https://web.archive.org/web/20210919153639/https://ieeexplore.ieee.org/document/5430762 |archive-date=September 19, 2021 |access-date=November 18, 2021}}</ref> == 历史 == 微处理器的客户对采用8008持谨慎态度,原因在于它存在诸多限制,如单一寻址模式、低时钟速度、低引脚数以及小型片上栈,这些因素限制了软件的规模和复杂度。对于8080的设计提案有很多,范围从仅仅给8008添加栈指令到完全脱离所有之前英特尔的架构。<ref>{{cite web|title=Creating the 8080: The Processor That Started the PC Revolution|url=https://www.pcmag.com/news/creating-the-8080-the-processor-that-started-the-pc-revolution|website=PCMag|last1=Miller|first1=Michael|url-status=live|archive-url=https://web.archive.org/web/20211114174610/https://www.pcmag.com/news/creating-the-8080-the-processor-that-started-the-pc-revolution|archive-date=November 14, 2021|access-date=14 November 2021|publisher=Zaff Davis}}</ref>最终的设计是各种提案之间的一种妥协。 [[Federico Faggin]]是8080架构的发起人,他在1972年初向英特尔的管理层提出了这一芯片设计,并推动了它的实施。六个月后,他终于获得了开发的许可。Faggin于1972年11月从日本聘请了与他一起设计4004的[[Masatoshi Shima]]。Shima在Faggin的指导下进行了详细设计<ref>{{cite web|title=8008 and 8080 Q&A|url=https://sites.google.com/site/microprocessorintel4004/8008-8080-q-a|website=Microprocessor Intel 4004|last1=Faggin|first1=Federico|url-status=live|archive-url=https://web.archive.org/web/20211115233233/https://sites.google.com/site/microprocessorintel4004/8008-8080-q-a|archive-date=November 15, 2021|access-date=15 November 2021}}</ref>,使用了Faggin为4000系列创造的随机逻辑硅门设计方法。 8080被明确设计为一个面向更广泛客户的通用微处理器。大量的开发工作致力于尝试将8008的辅助芯片的功能整合到一个封装中。开发初期就决定8080不与8008二进制兼容,而是选择源兼容性,一旦通过转译器运行,就可以允许新软件不受8008同样的限制。出于同样的原因,以及为了扩展基于栈的例程和中断的能力,栈被移至外部内存。 注意到程序员在大型机系统中对通用寄存器的专用使用,芯片架构师[[Stanley Mazor]]决定8080的寄存器将是专用的,寄存器对有不同的用途集。这也使得工程师能够更有效地将晶体管用于其他目的。<ref>{{cite journal |last1=Mazor |first1=Stanley |date=April–June 2007 |title=Intel 8080 CPU Chip Development |journal=IEEE Annals of the History of Computing |volume=29 |issue=2 |pages=70–73 |doi=10.1109/MAHC.2007.25 |s2cid=14755544}}</ref> Shima在1973年8月完成了布局。在NMOS制造调整之后,一个8080的原型在1974年1月完成。它有一个缺陷,即使用标准TTL设备驱动时,因为高电流流入狭窄的线路而增加了地线电压。在Shima对原型进行特性分析之前,英特尔已经按照销售部门的指示生产了40,000个8080单元。它被发布时要求使用低功耗肖特基TTL(LS TTL)设备。8080A修正了这个缺陷。<ref>{{Cite journal |last1=Shima |first1=Masatoshi |author-link=Masatoshi Shima |last2=Nishimura |first2=Hirohiko |last3=Ishida |first3=Haruhisa |year=1979 |title=座談会 マイクロコンピュータの誕生 開発者 嶋 正利氏に聞く |journal=Bit |language=ja |publisher=共立出版 |volume=11 |issue=11 |pages=4–12 |issn=0385-6984}}</ref> == 功能 == [[File:Intel_8080_arch.svg|right|thumb|i8080 微架构]] === 编译模型 === Intel 8080 是 [[Intel 8008|8008]] 的后继者。它使用与 8008 相同的基本[[指令集架構|指令集]]和[[寄存器]]模型,尽管它既不与其前身[[源代码兼容性|兼容源代码]],也不兼容[[机器码兼容性|二进制代码]]。8008 中的每条指令在 8080 中都有等效指令。8080 还在其指令集中添加了 16 位操作。而 8008 需要使用 HL 寄存器对来间接访问其 14 位内存空间,8080 添加了寻址模式,允许直接访问其完整的 16 位内存空间。8008 的内部 7 级下压调用堆栈被专用的 16 位堆栈指针(SP)寄存器替换。8080 的 40 引脚 [[DIP封裝|DIP 封装]]允许它提供 16 位[[地址總線|地址总线]]和 8 位[[數據總線|数据总线]],实现对 64 [[KiB]](2^16 字节)内存的访问。 {| class="infobox" style="font-size:88%;width:34em;" | style="text-align:center;" |<sup>1</sup><sub>5</sub> | style="text-align:center;" |<sup>1</sup><sub>4</sub> | style="text-align:center;" |<sup>1</sup><sub>3</sub> | style="text-align:center;" |<sup>1</sup><sub>2</sub> | style="text-align:center;" |<sup>1</sup><sub>1</sub> | style="text-align:center;" |<sup>1</sup><sub>0</sub> | style="text-align:center;" |<sup>0</sup><sub>9</sub> | style="text-align:center;" |<sup>0</sup><sub>8</sub> | style="text-align:center;" |<sup>0</sup><sub>7</sub> | style="text-align:center;" |<sup>0</sup><sub>6</sub> | style="text-align:center;" |<sup>0</sup><sub>5</sub> | style="text-align:center;" |<sup>0</sup><sub>4</sub> | style="text-align:center;" |<sup>0</sup><sub>3</sub> | style="text-align:center;" |<sup>0</sup><sub>2</sub> | style="text-align:center;" |<sup>0</sup><sub>1</sub> | style="text-align:center;" |<sup>0</sup><sub>0</sub> |''(bit position)'' |- | colspan="17" |'''主寄存器''' |- style="background:silver;color:black" | colspan="8" style="text-align:center;" |A | colspan="8" style="text-align:center;background:#DDD" |Flags | style="width:auto; background:white; color:black;" |'''程序状态字''' |- style="background:silver;color:black" | colspan="8" style="text-align:center;" |B | colspan="8" style="text-align:center;" |C | style="background:white; color:black;" |'''B''' |- style="background:silver;color:black" | colspan="8" style="text-align:center;" |D | colspan="8" style="text-align:center;" |E | style="background:white; color:black;" |'''D''' |- style="background:silver;color:black" | colspan="8" style="text-align:center;" |H | colspan="8" style="text-align:center;" |L | style="background:white; color:black;" |'''H''' ('''间接地址''') |- | colspan="17" |'''索引寄存器''' |- style="background:silver;color:black" | colspan="16" style="text-align:center;" |SP | style="background:white; color:black;" |'''栈指针''' |- | colspan="17" |'''程序计数器''' |- style="background:silver;color:black" | colspan="16" style="text-align:center;" |PC | style="background:white; color:black;" |'''程序计数器''' |- | colspan="17" |'''状态寄存器''' |- style="background:silver;color:black" | colspan="8" style="text-align:center; background:white" | | style="text-align:center;" |S | style="text-align:center;" |Z | style="text-align:center;" |0 | style="text-align:center;" |<sup>A</sup><sub>C</sub> | style="text-align:center;" |0 | style="text-align:center;" |P | style="text-align:center;" |1 | style="text-align:center;" |C | style="background:white; color:black" |Flags <ref name="AssyLang">{{cite book|title=8080 Assembly Language Programming Manual|date=1975|publisher=Intel|page=22|edition=Rev B|url=https://archive.org/download/intel-8080-assembly-language-programming-manual-1975/Intel%208080%20Assembly%20Language%20Programming%20Manual%20%281975%29.pdf|access-date=29 February 2024}}</ref> |} === 寄存器 === 处理器有七个 8 位寄存器(A、B、C、D、E、H 和 L),其中 A 是主 8 位累加器。其他六个寄存器可以根据特定指令作为单独的 8 位寄存器或在三个 16 位寄存器对(BC、DE 和 HL,在 Intel 文档中分别称为 B、D 和 H)中使用。某些指令还允许 HL 寄存器对作为(有限的)16 位累加器使用。伪寄存器 M,指的是由 HL 指向的解引用内存位置,几乎可以在任何其他寄存器可以使用的地方使用。8080 有一个 16 位的堆栈指针指向内存,替换了 8008 的内部堆栈,并有一个 16 位的程序计数器。 标志 处理器维护内部标志位([[状态寄存器]]),这些[[位段|标志位]]指示算术和逻辑指令的结果。只有特定的指令会影响标志位。标志位包括: * 符号(S),如果结果为负则设置。 * 零(Z),如果结果为零则设置。 * 奇偶校验(P),如果结果中 1 的位数为偶数则设置。 * 进位(C),如果最后一次加法操作产生了进位或者最后一次减法操作需要借位则设置。 * 辅助进位(AC 或 H),用于[[二進碼十進數|二进制编码]]的十进制算术(BCD)。 特定指令可以设置或反转进位位。条件分支指令测试各种标志状态位。累加器和标志位一起被称为 PSW,或程序状态字。PSW 可以被推入或从堆栈中弹出。 === 命令与指令 === 与许多其他 8 位处理器一样,所有指令都编码为一个字节(包括寄存器编号,但不包括立即数数据),以简化操作。有些可以跟随一到两个字节的数据,这可以是立即数操作数、内存地址或端口号。像更高级的处理器一样,它有自动 CALL 和 RET 指令用于多级过程调用和返回(甚至可以像跳转一样有条件地执行),以及用于在机器堆栈上保存和恢复任何 16 位寄存器对的指令。存在八个一字节的调用指令(RST),用于在固定地址 00h、08h、10h、...、38h 处的子程序。这些旨在由外部硬件提供,以调用相应的中断服务例程,但也经常用作[[快速系统调用]]。执行最慢的指令是 XTHL,用于将 HL 寄存器对与堆栈指针指示的地址处存储的值交换。 ==== 8 位指令 ==== 所有具有两个操作数的 8 位操作只能在 8 位[[累加器]](A 寄存器)上执行。另一个操作数可以是立即值、另一个 8 位寄存器或由 16 位寄存器对 HL 地址的内存字节。增量和减量操作可以在任何 8 位寄存器或 HL 地址的内存字节上执行。支持直接复制任意两个 8 位寄存器之间以及任何 8 位寄存器和 HL 地址的内存字节之间。由于 MOV 指令的规则编码(使用了可用操作码空间的四分之一),存在将寄存器复制到其自身的冗余代码({{code|MOV B,B}}),除了用于延迟外几乎无用。然而,系统性的 MOV M,M 操作码被用来编码停止(HLT)指令,直到外部重置或中断发生时停止执行。 ==== 16 位操作 ==== 虽然 8080 通常是一个 8 位处理器,它有限地能够执行 16 位操作。任何三个 16 位寄存器对(BC、DE 或 HL,在 Intel 文档中分别称为 B、D、H)或 SP 可以使用{{code|LXI}}加载立即 16 位值,使用{{code|INX}} 和 {{code|DCX}}进行增量或减量操作,或使用 {{code|DAD}} 加到 HL 上。通过将 HL 加到其自身,可以使用一条指令实现与 16 位算术左移相同的结果。唯一影响任何标志的 16 位指令是 {{code|DAD}},它设置 CY([[进位]])标志,以允许进行编程的 24 位或 32 位[[算术]](或更大),这对于实现[[浮点算术]]是必需的。可以使用 {{code|DAD SP}} 和 {{code|SPHL}} 分配堆栈帧。可以使用 {{code|PCHL}}, 执行对计算指针的跳转。{{code|LHLD}} 从直接寻址的内存中加载 HL,{{code|SHLD}} 同样存储 HL。{{code|XCHG}}<ref>[http://www.classiccmp.org/dunfield/r/8080.txt 8080 instruction encoding] {{Webarchive|url=https://web.archive.org/web/20180305170555/http://www.classiccmp.org/dunfield/r/8080.txt|date=March 5, 2018}}. ClassicCMP.org. Retrieved on October 23, 2011.</ref>指令交换 HL 和 DE 寄存器对的值。XTHL 与堆栈上最后推入的项和 HL 交换。 === 指令集 === {| class="wikitable" style="text-align:center" ! colspan="8" |操作码 ! colspan="2" |操作数 ! rowspan="2" |助记符 ! rowspan="2" |周期数 ! rowspan="2" |描述 |- !7 !6 !5 !4 !3 !2 !1 !0 !b2 !b3 |- |0 |0 |0 |0 |0 |0 |0 |0 |— |— | align="left" |NOP |4 | align="left" |No operation |- |0 |0 | colspan="2" |RP |0 |0 |0 |1 |''datlo'' |''dathi'' | align="left" |LXI ''rp,data'' |10 | align="left" |RP ← ''data'' |- |0 |0 | colspan="2" |RP |0 |0 |1 |0 |— |— | align="left" |STAX ''rp'' |7 | align="left" |(RP) ← A [BC or DE only] |- |0 |0 | colspan="2" |RP |0 |0 |1 |1 |— |— | align="left" |INX ''rp'' |5 | align="left" |RP ← RP + 1 |- |0 |0 | colspan="3" |DDD |1 |0 |0 |— |— | align="left" |INR ''ddd'' |5/10 | align="left" |DDD ← DDD + 1 |- |0 |0 | colspan="3" |DDD |1 |0 |1 |— |— | align="left" |DCR ''ddd'' |5/10 | align="left" |DDD ← DDD - 1 |- |0 |0 | colspan="3" |DDD |1 |1 |0 |''data'' |— | align="left" |MVI ''ddd,data'' |7/10 | align="left" |DDD ← data |- |0 |0 | colspan="2" |RP |1 |0 |0 |1 |— |— | align="left" |DAD ''rp'' |10 | align="left" |HL ← HL + RP |- |0 |0 | colspan="2" |RP |1 |0 |1 |0 |— |— | align="left" |LDAX ''rp'' |7 | align="left" |A ← (RP) [BC or DE only] |- |0 |0 | colspan="2" |RP |1 |0 |1 |1 |— |— | align="left" |DCX ''rp'' |5 | align="left" |RP ← RP - 1 |- |0 |0 |0 |0 |0 |1 |1 |1 |— |— | align="left" |RLC |4 | align="left" |A<sub>1-7</sub> ← A<sub>0-6</sub>; A<sub>0</sub> ← Cy ← A<sub>7</sub> |- |0 |0 |0 |0 |1 |1 |1 |1 |— |— | align="left" |RRC |4 | align="left" |A<sub>0-6</sub> ← A<sub>1-7</sub>; A<sub>7</sub> ← Cy ← A<sub>0</sub> |- |0 |0 |0 |1 |0 |1 |1 |1 |— |— | align="left" |RAL |4 | align="left" |A<sub>1-7</sub> ← A<sub>0-6</sub>; Cy ← A<sub>7</sub>; A<sub>0</sub> ← Cy |- |0 |0 |0 |1 |1 |1 |1 |1 |— |— | align="left" |RAR |4 | align="left" |A<sub>0-6</sub> ← A<sub>1-7</sub>; Cy ← A<sub>0</sub>; A<sub>7</sub> ← Cy |- |0 |0 |1 |0 |0 |0 |1 |0 |''addlo'' |''addhi'' | align="left" |SHLD ''add'' |16 | align="left" |(add) ← HL |- |0 |0 |1 |0 |0 |1 |1 |1 |— |— | align="left" |DAA |4 | align="left" |If A<sub>0-3</sub> > 9 OR AC = 1 then A ← A + 6; then if A<sub>4-7</sub> > 9 OR Cy = 1 then A ← A + 0x60 |- |0 |0 |1 |0 |1 |0 |1 |0 |''addlo'' |''addhi'' | align="left" |LHLD ''add'' |16 | align="left" |HL ← (add) |- |0 |0 |1 |0 |1 |1 |1 |1 |— |— | align="left" |CMA |4 | align="left" |A ← ¬A |- |0 |0 |1 |1 |0 |0 |1 |0 |''addlo'' |''addhi'' | align="left" |STA ''add'' |13 | align="left" |(add) ← A |- |0 |0 |1 |1 |0 |1 |1 |1 |— |— | align="left" |STC |4 | align="left" |Cy ← 1 |- |0 |0 |1 |1 |1 |0 |1 |0 |''addlo'' |''addhi'' | align="left" |LDA ''add'' |13 | align="left" |A ← (add) |- |0 |0 |1 |1 |1 |1 |1 |1 |— |— | align="left" |CMC |4 | align="left" |Cy ← ¬Cy |- |0 |1 | colspan="3" |DDD | colspan="3" |SSS |— |— | align="left" |MOV ''ddd,sss'' |5/7 | align="left" |DDD ← SSS |- |0 |1 |1 |1 |0 |1 |1 |0 |— |— | align="left" |HLT |7 | align="left" |Halt |- |1 |0 | colspan="3" |ALU | colspan="3" |SSS |— |— | align="left" |ADD ADC SUB SBB ANA XRA ORA CMP ''sss'' |4/7 | align="left" |A ← A [ALU operation] SSS |- |1 |1 | colspan="3" |CC |0 |0 |0 |— |— | align="left" |Rcc |5/11 | align="left" |If cc true, PC ← (SP), SP ← SP + 2 |- |1 |1 | colspan="2" |RP |0 |0 |0 |1 |— |— | align="left" |POP ''rp'' |10 | align="left" |RP ← (SP), SP ← SP + 2 |- |1 |1 | colspan="3" |CC |0 |1 |0 |''addlo'' |''addhi'' | align="left" |Jcc ''add'' |10 | align="left" |If cc true, PC ← add |- |1 |1 |0 |0 |0 |0 |1 |1 |''addlo'' |''addhi'' | align="left" |JMP ''add'' |10 | align="left" |PC ← add |- |1 |1 | colspan="3" |CC |1 |0 |0 |''addlo'' |''addhi'' | align="left" |Ccc ''add'' |11/17 | align="left" |If cc true, SP ← SP - 2, (SP) ← PC, PC ← add |- |1 |1 | colspan="2" |RP |0 |1 |0 |1 |— |— | align="left" |PUSH ''rp'' |11 | align="left" |SP ← SP - 2, (SP) ← RP |- |1 |1 | colspan="3" |ALU |1 |1 |0 |''data'' |— | align="left" |ADI ACI SUI SBI ANI XRI ORI CPI ''data'' |7 | align="left" |A ← A [ALU operation] data |- |1 |1 | colspan="3" |N |1 |1 |1 |— |— | align="left" |RST ''n'' |11 | align="left" |SP ← SP - 2, (SP) ← PC, PC ← N x 8 |- |1 |1 |0 |0 |1 |0 |0 |1 |— |— | align="left" |RET |10 | align="left" |PC ← (SP), SP ← SP + 2 |- |1 |1 |0 |0 |1 |1 |0 |1 |''addlo'' |''addhi'' | align="left" |CALL ''add'' |17 | align="left" |SP ← SP - 2, (SP) ← PC, PC ← add |- |1 |1 |0 |1 |0 |0 |1 |1 |''port'' |— | align="left" |OUT ''port'' |10 | align="left" |Port ← A |- |1 |1 |0 |1 |1 |0 |1 |1 |''port'' |— | align="left" |IN ''port'' |10 | align="left" |A ← Port |- |1 |1 |1 |0 |0 |0 |1 |1 |— |— | align="left" |XTHL |18 | align="left" |HL ↔ (SP) |- |1 |1 |1 |0 |1 |0 |0 |1 |— |— | align="left" |PCHL |5 | align="left" |PC ← HL |- |1 |1 |1 |0 |1 |0 |1 |1 |— |— | align="left" |XCHG |4 | align="left" |HL ↔ DE |- |1 |1 |1 |1 |0 |0 |1 |1 |— |— | align="left" |DI |4 | align="left" |Disable interrupts |- |1 |1 |1 |1 |1 |0 |0 |1 |— |— | align="left" |SPHL |5 | align="left" |SP ← HL |- |1 |1 |1 |1 |1 |0 |1 |1 |— |— | align="left" |EI |4 | align="left" |Enable interrupts |- !7 !6 !5 !4 !3 !2 !1 !0 !b2 !b3 !助记符 !周期数 !描述 |- ! colspan="13" | |- ! colspan="5" |SSS DDD !2 !1 !0 ! colspan="2" |CC !ALU !RP ! |- | colspan="5" |B |0 |0 |0 | colspan="2" |NZ | align="left" |ADD ADI (A ← A + arg) |BC |- | colspan="5" |C |0 |0 |1 | colspan="2" |Z | align="left" |ADC ACI (A ← A + arg + Cy) |DE |- | colspan="5" |D |0 |1 |0 | colspan="2" |NC | align="left" |SUB SUI (A ← A - arg) |HL |- | colspan="5" |E |0 |1 |1 | colspan="2" |C | align="left" |SBB SBI (A ← A - arg - Cy) |SP or PSW |- | colspan="5" |H |1 |0 |0 | colspan="2" |PO | align="left" |ANA ANI (A ← A ∧ arg) |- | colspan="5" |L |1 |0 |1 | colspan="2" |PE | align="left" |XRA XRI (A ← A ⊻ arg) |- | colspan="5" |M |1 |1 |0 | colspan="2" |P | align="left" |ORA ORI (A ← A ∨ arg) |- | colspan="5" |A |1 |1 |1 | colspan="2" |N | align="left" |CMP CPI (A - arg) |- ! colspan="5" |SSS DDD !2 !1 !0 ! colspan="2" |CC !ALU ! colspan="2" | |} === 输入/输出方案 === ==== 输入输出端口空间 ==== 8080 支持多达 256<ref>Note: Some Intel datasheets from the 1970s advertise 512 I/O ports, because they count input and output ports separately.</ref> 个[[I/O|输入/输出]](I/O)端口,通过使用端口地址作为操作数的专用 I/O 指令访问。<ref>{{cite book|title=Computer Architecture and Organization|url=https://archive.org/details/computerarchitec0000haye_p5w8|last1=HAYES|first1=JOHN P.|isbn=0-07-027363-4|year=1978|publisher=|pages=[https://archive.org/details/computerarchitec0000haye_p5w8/page/n437 420]–423}}</ref>这种 I/O 映射方案被认为是一个优势,因为它释放了处理器有限的地址空间。许多 CPU 架构相反使用所谓的[[内存映射]] I/O(MMIO),在这种设计中,RAM 和外围芯片使用共同的地址空间。这消除了对专用 I/O 指令的需求,尽管这样的设计可能存在的一个缺点是,由于外围设备通常比内存慢,因此必须使用特殊硬件来插入等待状态。然而,在一些简单的 8080 计算机中,I/O 确实被当作内存单元进行寻址,即“内存映射”,从而不使用 I/O 命令。I/O 寻址有时也可以利用处理器将相同的 8 位端口地址输出到低地址字节和高地址字节的事实(即,IN 05h 会在 16 位地址总线上放置地址 0505h)。类似的 I/O 端口方案被用在向后兼容的 Zilog Z80 和 Intel 8085,以及密切相关的 x86 微处理器系列中。 ==== 独立的堆栈空间 ==== 处理器状态字中的一个位(见下文)指示处理器正在从堆栈访问数据。使用这个信号,可以实现一个独立的堆栈内存空间。这个功能很少被使用。 === 状态字 === 对于更高级的系统,在每个机器周期的开始,处理器在数据总线上放置一个八位状态字。这个字节包含的标志决定了是访问内存还是 I/O 端口,以及是否需要处理中断。 中断系统状态(启用或禁用)也在一个单独的引脚上输出。对于简单系统,其中不使用中断,在某些情况下可能会发现这个引脚被用作额外的单比特输出端口(例如,在[[苏联]]制造的流行的 [[Radio-86RK]] 计算机)。 === 示例代码 === 以下是8080/8085汇编器源代码,用于一个名为memcpy的子程序,该子程序将给定大小的数据块从一个位置复制到另一个位置。数据块一次复制一个字节,数据移动和循环逻辑使用16位操作。 {| |<pre> 1000 1000 1000 78 1001 B1 1002 C8 1003 1A 1004 77 1005 13 1006 23 1007 0B 1008 78 1009 B1 100A C2 03 10 100D C9 </pre> |<syntaxhighlight lang="nasm"> ; memcpy -- ; 将内存块从一个位置复制到另一个位置。 ; ; 输入寄存器 ; BC - 要复制的字节数 ; DE - 源数据块的地址 ; HL - 目标数据块的地址 ; ; 返回寄存器 ; BC - 零 org 1000h ;起始地址为1000h memcpy public mov a,b ;将寄存器B的值复制到寄存器A ora c ;寄存器A与寄存器C进行按位或操作,结果存入寄存器A rz ;如果零标志被置位,则返回 loop: ldax d ;从DE指向的地址加载数据到A mov m,a ;将寄存器A的内容存储到HL指向的地址 inx d ;增加 DE inx h ;增加 HL dcx b ;BC减一(不影响标志位) mov a,b ;将B复制到A(以便将BC与零比较) ora c ;A = A | C (B和C都是零吗?) jnz loop ;如果零标志未被置位,则跳转到'loop:' ret ;返回 </syntaxhighlight> |} [[File:Intel_8080_Microprocessor.png|thumb|547x547px|8080 针脚定义]] === 针脚 === 地址总线拥有自己的16个针脚,而数据总线有8个可用的针脚,无需任何复用。使用另外两个针脚(读和写信号),可以非常容易地组装简单的微处理器设备。仅需为独立的IO空间、中断和DMA添加解码处理器针脚信号的芯片。 然而,针脚的负载能力是有限的;即使是简单的计算机通常也需要总线放大器。 处理器需要三个电源(-5V、+5V和+12V)和两个非重叠的高幅度同步信号。然而,至少在苏联后期的版本КР580ВМ80А能够仅使用单一的+5V电源工作,将+12V针脚连接到+5V,将-5V针脚接地。 随芯片提供的文档中的针脚布局表,如下描述针脚: {| class="wikitable" !针脚 !信号 !类型 !指令 |- |1 |A10 |Output |地址总线10 |- |2 |GND |— |地 |- |3 |D4 | rowspan="8" |Bidirectional | rowspan="8" |双向数据总线,处理器还会暂时在此设置“处理器状态”,提供有关处理器当前正在执行的操作的信息: * D0 读取中断命令。响应中断信号时,处理器正在读取并执行一个带有此标志的任意命令。通常,支持芯片会提供子程序调用命令(CALL或RST),将控制权转移到中断处理代码 * D1 读取(低电平意味着写入) * D2 访问堆栈(可能最初计划了一个单独的堆栈内存空间) * D3 无操作,已被HLT指令停止 * D4 向输出端口写入数据 * D5 读取可执行指令的第一个字节 * D6 从输入端口读取数据 * D7 从内存读取数据 |- |4 |D5 |- |5 |D6 |- |6 |D7 |- |7 |D3 |- |8 |D2 |- |9 |D1 |- |10 |D0 |- |11 |−5 V |— | -5伏电源供应。这必须是首先连接的电源,并且是最后断开的电源,否则处理器将会受损 |- |12 |RESET |Input |复位。该信号强制执行位于0000地址的命令。其他处理器寄存器的内容不会被修改。这是一个反相输入(激活电平为逻辑0) |- |13 |HOLD |Input |直接内存访问请求。请求处理器将数据和地址总线切换到高阻抗(“断开连接”)状态 |- |14 |INT |Input |中断请求 |- |15 |φ2 |Input |时钟发生器信号的第二相位 |- |16 |INTE |Output |处理器拥有两个命令,用于在该引脚上设置0或1电平。这个引脚通常被用于中断控制。然而,在简单的计算机中,它有时被用作单比特输出端口,用于各种目的 |- |17 |DBIN |Output |读(处理器从内存或输入端口读取数据) |- |18 |WR |Output |写(处理器向内存或输出端口写入数据。这是一个反向输出,激活电平为逻辑零) |- |19 |SYNC |Output |激活电平表明处理器已经将“状态字”放置在数据总线上。这个状态字的各个位提供了额外的信息,以支持独立的地址和内存空间、中断和直接内存访问。这个信号在可以用于将数据总线上的处理器状态字写入某个外部寄存器之前,需要通过额外的逻辑处理,例如,[http://www.datasheets360.com/pdf/-4828066515233335508 8238] {{Wayback|url=http://www.datasheets360.com/pdf/-4828066515233335508 |date=20230918030959 }}系统控制器和总线驱动器 |- |20 | +5 V |— | +5伏电源供应 |- |21 |HLDA |Output |直接内存访问确认。处理器将数据和地址引脚切换到高阻抗状态,允许其他设备操纵总线 |- |22 |φ1 |Input |时钟发生器信号的第一相位 |- |23 |READY |Input |等待(利用这个信号,可以暂停处理器的工作。它还用于支持基于硬件的逐步调试模式) |- |24 |WAIT |Output |等待(指示处理器处于等待状态) |- |25 |A0 | rowspan="3" |Output | rowspan="3" |地址总线 |- |26 |A1 |- |27 |A2 |- |28 |12 V |— | +12伏电源供应,这必须是最后连接和第一个断开的电源 |- |29 |A3 | rowspan="12" |Output | rowspan="12" |地址总线;可以根据需求切换到高阻抗状态 |- |30 |A4 |- |31 |A5 |- |32 |A6 |- |33 |A7 |- |34 |A8 |- |35 |A9 |- |36 |A15 |- |37 |A12 |- |38 |A13 |- |39 |A14 |- |40 |A11 |} == 支持芯片 == 8080的成功关键因素之一是有广泛的支持芯片可用,提供串行通信、计数/定时、输入/输出、直接内存访问和可编程中断控制等多种功能: * 8214 - [[优先级中断控制单元]]<ref>[http://www.bitsavers.org/components/intel/MCS80/98-153B_Intel_8080_Microcomputer_Systems_Users_Manual_197509.pdf Intel Corporation, "8214 Priorty Interrupt Control Unit", Intel 8080 Microcomputer Systems User's Manual, September 1975, page 5-153] {{Wayback|url=http://www.bitsavers.org/components/intel/MCS80/98-153B_Intel_8080_Microcomputer_Systems_Users_Manual_197509.pdf |date=20240528085204 }} from bitsaver.org in PDF</ref><ref>Intel Corporation, "Two Low-Cost, Programmable LSI Device Make Designs Easier To Implement, Reduce Cost Of 4-bit MCS-40 Systems", Intel Microcomputer News, Volume 3, No. 1, January 1976, page 1</ref> * 8224 – [[时钟发生器]] * 8228/[http://www.datasheets360.com/pdf/-4828066515233335508 8238] {{Wayback|url=http://www.datasheets360.com/pdf/-4828066515233335508 |date=20230918030959 }} – 系统控制器和总线驱动器 * [[8251]] – 通信控制器 * [[8253]] – [[可编程间隔定时器]] * [[8255]] – 可编程外围接口 * [[8257]] – [[DMA控制器]] * [[8259]] – [[可编程中断控制器]] == 实现 == 8080[[集成电路]]使用非饱和增强型负载[[nMOS]]门,需要额外的电压(用于负载门偏置)。它是在一个[[自对准栅极|硅门]]过程中制造的,使用最小特征尺寸为6微米。设计中大约4500个晶体管通过单层金属层互联,但较高电阻的多晶硅层(一些互联需要更高的电压)是用晶体管门实现的。[[晶圆级封装|芯片]]尺寸大约为20平方毫米。{{Intel processors}} {{Authority control}} [[Category:Intel x86處理器]] [[Category:8位元微處理器]] [[Category:1974年面世]] {{Microcompu-stub}}
摘要:
请注意,所有对Local Chinese Wikipedia的贡献均可能会被其他贡献者编辑、修改或删除。如果您不希望您的文字作品被随意编辑,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源(详情请见
Project:著作权
)。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)
导航菜单
个人工具
未登录
讨论
贡献
创建账号
登录
命名空间
页面
讨论
大陆简体
不转换
简体
繁體
大陆简体
香港繁體
澳門繁體
大马简体
新加坡简体
臺灣正體
查看
阅读
编辑
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
工具
链入页面
相关更改
特殊页面
页面信息