作者:Andre Adrian版本:2011年6月4日Z80是Zilog在1976年推出的8位CPU。它就像英特尔8085(1976),一种改进的英特尔8080设计。Intel8080(1974)是改进后的Intel8008。8008(1972)是DATAPOINT 2200CPU(1971)的MOS版本,它由100个TTL芯片实现。与8085相比,市场更喜欢Z80。家用电脑如Tandy Radio Shack TRS-80,SclairZX-81和Amstrad CPC464都使用过它。当时常见的操作系统,数码研究公司的CP/M需要8080、8085或Z80才能运行,而今天,任天堂游戏机里还保留着一台增强型8080。Z80有很多寄存器。更成功的6502只有几个寄存器,但是允许快速存储器访问以补偿丢失的寄存器的页面零寻址模式。但为什么与6502相比,Z80是一个数字计算器呢?嗯,值加载到Z80寄存器后,数据总线仅用于加载操作码。6502需要更多的负载和树脂来执行16位或32位的算术运算。重要提示:所有示例都可以使用荷兰开放大学的MPF-1B;Z80开发工具Z80DT进行评估。此Z80编辑器/汇编器/仿真器与MS-DOS或ANMS-DOS仿真器一起运行(您可以运行MS-DOS仿真器来运行CPU仿真器...)。Z80寄存器集不是很正交,即一个特定的寄存器只能执行某些操作。寄存器是:使用一个操作码,寄存器HL、DE、BC可以与可选的寄存器H';L&39;、D';E&39;、B';C';交换寄存器H';L';、D';E';、B';C';。这比从内存加载/存储要快得多。累加器A和标志F可以与具有另一个操作码的备用A和标志F互换。也有一个操作码交换寄存器HL和DE。数据寄存器B、C、D、E可以移位、旋转和位测试它们的内容,这些寄存器不是通用寄存器--算术运算的结果只能在A或HL寄存器中。累加器和数据寄存器的行为类似于编程语言C中的整数变量。地址寄存器(索引寄存器)将其内容用作内存引用(指针)。它们的目的是从/向非常量地址加载/存储数据。IX、IY寄存器可以向地址添加偏移量(位移)。AddressregistersbehavelikepointervariablesintheprogramminglanguageC.。第一个例子是16位加法。这是相当于";hello world";的汇编器:;负载测试值:将十进制VALUE12345加载到寄存器HL、12345、12345;将十进制VALUE12345加载到寄存器HL中;将十进制VALUE12345加载到寄存器HL中;将十进制VALUE12345加载到寄存器中;将十进制值7加载到寄存器DE中;将十进制值7加载到寄存器DE中。调用子例程;===,以停止操作,以停止操作;调用HALTTHEZ80ORTHESIMULATOR;===;添加例程16+16bit=16bit;HL=HL+DE;更改标志;ADD16:添加例程,以添加HL,DE;16位添加HL和DE;16位添加HL和DE;结果为:在HL中;使用UBROUBROUTINE命令,操作操作;使用命令;RETURNFROUBROUTINE操作程序,使用命令;添加标志;添加命令行,添加命令行;RETURNFROUBROUTINE,命令行,执行命令行;RETURNFROUBROUTINE,命令行,将命令行添加到;PSEUDOOP-CODEFORASSEMBLER通常32位值存储在类似H';L';的交替寄存器中的高16位和正常寄存器HL中的低16位。EXXop-code确实交换了寄存器B、C、D、E、H、L;负载测试值交换了寄存器B、C、D、E、H、L;负载测试值为01213H、01213H;加载寄存器B、C、D、E、H、L;加载十六进制的1213TO HL(低16位);加载十六进制的1213TO HL(低16位);加载十六进制的F000TO DE(低16位);加载十六进制的F000TO DE(低16位);加载:01011H、01213H、01213H、01213H、01213H;;加载十六进制的1013TO HL、01011H、01213H、;加载十六进制的1013TO HL(低16位);加载十六进制的F000TO DE(低16位);加载十六进制的F000TO DE(低16位)。L';(上部16位)将重新调用;===;添加例程32+32bit=32bit;H';L';L';HL=H';L';L';HL=H';HL+D&39;E';DE;添加例程32+32bit=32bit;H';L';HL=H';L';HL+D&39;E';DE;添加例程32+32bit=32bit;H';L';HL=H';HL+D&39;E';更改旗帜;ADD32:带进位的HL、DE和DE的16位添加;HL和DE的16位添加;的16位添加;EXX的16位添加;ADC的16位添加;HL、DE的16位添加;带进位的HL和DE的16位添加;结果在H';L';HL说,我们的RET是美国的,但最终,EXX操作码写起来和读起来都很难看,但这就是为什么每个在8位中进行数字运算的人都喜欢Z80而不是8085的原因。将C语言if()语句转换成Z80汇编语言非常麻烦:首先,Z80中只有一个8位的比较操作码。要比较更大的数字,必须做减法。
第三,跳转转到语句的";Else&34;部分,因此跳转操作码在逻辑上与CompareOperator相反。
第四,在IF部分的末尾,需要无条件地跳转到IF-ELSE块的末尾。
所有这些令人讨厌的细节都可以放在一张桌子上。如果没有这个表,千万不要编写汇编语言程序!注:JP PO是溢出时的跳转。溢出标志是有符号数字的进位标志。在Z80中,溢出标志和奇偶校验标志是相同的。JP PO的正式名称是JUMP on Parity ODD。正如他们所说,只是为了迷惑俄国人。作为示例,请参见以下C代码片段的汇编器清单。*短HL,DE;字符A;*HL=-2000;*DE=