1.3.2 6502微处理器
本节将介绍一个处理器体系结构,与功能强大的现代处理器相比,该处理器的设计相对简单。本节的目的是普及各种复杂度的处理器共有的一些基本概念。
MOS Technology公司于1975年推出了6502处理器,该处理器早年广泛用于雅达利(Atari)和任天堂(Nintendo)的视频游戏机,以及Commodore和苹果销售的计算机。直到今天,该处理器还在嵌入式系统中广泛使用,据估计,截至2018年,该处理器的产量在50亿至100亿之间。在流行文化领域,根据屏幕中所展现的画面,Futurama中的机器人Bender和《终结者》中的T-800机器人似乎都使用了6502。
许多早期微处理器(如6502等)都由5V的恒定电压供电。在这些电路中,低信号电平是0~0.8V的任何电压。高信号电平是2~5V的任何电压。低信号电平定义为逻辑0,高信号电平定义为逻辑1。第2章中将进一步深入探究数字电子技术。
处理器的字长定义了操作的基本数据元素的大小。6502的字长为8位,意味着6502一次可读写内存中的8位数据,也可以将数据存储在内部8位宽的寄存器中。
6502的程序内存和数据内存共享同一个地址空间,并通过单总线访问其内存。与Intel 8088相同,6502实现了冯·诺依曼体系结构。6502具有16位地址总线,可访问64KB的内存。
1千字节(缩写为KB)定义为210(1024)字节。16条地址线的二进制组合数是216,可以访问64乘以1024,即65536个空间。需要注意的是,设备可以寻址64KB并不意味着所有这些空间都必须是内存。基于6502处理器的Commodore VIC-20计算机中只包含5KB的随机存取存储器(RAM)和20KB的只读存储器(ROM)。
图1.1 6502寄存器组
6502具有称为寄存器的内部存储区域。寄存器是逻辑设备中的一个存储子设备,可以在其中存储信息字并在计算期间对其进行操作。典型的处理器包含少量寄存器,用于临时存储数据值和执行加法或地址计算等操作。
图1.1显示了6502寄存器结构,它包含5个8位寄存器(A、X、Y、P和S)和1个16位寄存器(PC)。每个寄存器上方的数字表示寄存器两端的位号。
A、X和Y寄存器中的任何一个都可以用作通用存储空间。只要指令没有修改寄存器内容,程序指令就可以将数值加载到其中一个寄存器中,并且稍后的一些指令会出于某种目的使用其中保存的值。A寄存器是唯一能够执行算术运算的寄存器。在计算内存地址时,可以使用X和Y寄存器作为索引寄存器,但不能使用A寄存器。
P寄存器保存处理器标志。除标记为1的位外,该寄存器中的其他位都有专门的用途。标记为1的位未定义,可以忽略。该寄存器中剩余的每一位称为一个标志,表示已发生了特定条件或表示设置了某种配置。6502的标志定义如下:
·N:负号标志。当算术运算的结果的位7为1时,此标志位设为1。此标志在有符号算术中使用。
·V:溢出标志。当有符号加法或减法导致上溢或下溢,即超出-128~127范围时,该标志位设为1。
·B:中断标志。此标志表示已执行了中断(BRK)指令。通常情况下,该位没有定义。只有在通过BRK指令(或中断)将P寄存器的内容存储到堆栈时,才需要检查B标志。在中断处理期间,B标志置位(即为1)表明是由BRK指令引起的软件中断,而不是硬件引起的中断。
·D:十进制模式标志。该标志指示处理器算术运算将在二进制编码的十进制(BCD)模式下运行。由于BCD模式很少使用,因此这里不再讨论,只需注意这种以10为基数的计算模式与分析机和ENIAC的体系结构具有一定的相似性。
·I:中断禁用标志。该标志表示不会处理中断请求(但非可屏蔽中断除外)。
·Z:零标志。当运算结果为零时该标志设为1。
·C:进位标志。当算术运算产生进位时该标志设为1。
在涉及循环、计数和算术运算等通用计算的上下文中,N、V、Z和C是最重要的标志。
S寄存器是堆栈指针。在6502中,堆栈是从地址$100到$1FF的内存区域。这256字节的空间用于临时存储子程序内的参数,并在调用子程序时保存返回地址。系统启动时,S寄存器将指向此范围的顶部作为初始状态。使用PHA等指令将数据“压”入堆栈(PHA指令会将A寄存器的内容压入堆栈)。当数据被压入堆栈时,6502使用S寄存器指定的地址加上固定的$100偏移量作为写入数据的内存地址,然后对S寄存器的地址做递减操作。通过执行更多的压入指令,可以将其他数据放入堆栈。当压入更多的数据时,堆栈在内存中向下增长。在将数据压入堆栈中时,程序必须注意不能超过固定的256字节堆栈大小。
必须用与压入顺序相反的顺序检索存储在堆栈中的数据。堆栈是后进先出(LIFO)数据结构,这意味着当从堆栈“弹出”(pop)一个数据时,它是最近压入的字节。PLA指令将S寄存器加1,然后将S寄存器(加上$100偏移量)指示的地址处的值复制到A寄存器中。
PC寄存器是程序计数器,其中存放要执行的下一条指令所在的内存地址。与其他寄存器不同,PC的长度为16位,允许访问6502的整个地址空间。每条指令由1字节操作码(opcode)组成,根据指令的不同,操作码后面可以跟0~2个操作数字节。执行完每条指令后,PC会更新以指向刚刚执行的指令之后的下一条指令。除了在顺序指令执行期间的自动更新之外,PC还可以通过跳转指令、分支指令以及子程序调用和返回指令进行修改。