假如累加器A存放的字节是35h,累加器B存放的字节是22h,经过减法运算:SUB A, B
累加器中的值变为22h,即两个字节的差。
如果累加器A中的值为35h,寄存器H和L中的值分别是10h和7Ch,而存储器地址107Ch处的字节为4Ah,指令:
ADD A, [HL]
把累加器中的值(35h)与寄存器对HL寻址(107Ch)存储器得到的数值(4Ah)相加,并把计算结果(7Fh)保存到累加器。
在8080中,使用ADC指令和SBB指令可以对16位数、24位数、32位数甚至更高位的数进行加法、减法运算。例如,假设现在寄存器对BC和DE各自保存了一个16位的数,我们要把这两个数相加,并且把结果保存在寄存器对BC中。具体做法如下:
MOV A, C ;低字节操作
ADD A, E
MOV C, A
MOV A, B ;高字节操作
ADC A, D
MOV B, A
在上面的计算中,用ADD指令对低字节相加,用ADC指令对高字节相加。低字节相加产生的进位会进入高字节的运算中。在这段简短的代码中,我们用到了4个MOV指令,这是因为在8080中只能利用累加器进行加法运算,操作数在累加器和寄存器之间来回地传送,因此在8080的代码中会大量使用MOV指令。
现在我们来讨论8080的标志位(flag)。第17章设计的处理器已经有了CF(进位标志位)和ZF(零标志位)两个标志位,在8080中又新增了3个标志位,包括符号标志位SF,奇偶标志位PF和辅助进位标志位AF。在8080中,用一个专门的8位寄存器来存放所有标志位,该寄存器称做程序状态字(Program Status Word,PSW)。不同的指令对标志位有不同的影响,LDA、STA或MOV指令始终都不会影响标志位,而ADD、SUB、ADC以及SBB指令会影响标志位的状态,具体情况如下。
编码—隐匿在计算机软硬件背后的语言
286