第3节 指令系统
推荐给好友
打印
加入收藏
更新于2008-07-25 21:13:41

       CPU的功能是从外部设备获得数据,通过加工、处理,再把处理结果送到CPU的外部世界。设计一台计算机,首先需要设计一套可以执行特定功能的操作命令,这种操作命令称为指令。CPU所能执行的各种指令的集合,称为该微处理器的指令系统。设计一种微处理器,一般从设计它的指令系统开始。指令系统因机器不同而不同。HC08 CPU共有118个保留字,加上寻址方式形成了270条具体指令,比HC05 CPU增加了78条指令。为了方便学习,将这些指令分为数据传送、算术运算、逻辑运算、位操作、移位、程序控制及其它等七类。本节分别介绍这些指令,并对每条具体指令进行统一编号。表3-1给出保留字的简明含义。

                                                                                                                                                                                           

        本节随后给出HC08 CPU指令系统的全部指令,并给出必要的解释。为了使得指令格式简明易懂,在不影响意义理解情况下,涉及A、H、X、CCR等寄存器的操作省略括号,而(HX)则表示HX所指向的存储器地址单元,(addr8)表示8位地址单元,(addr16)表示16位地址单元。书末附录给出的按字母排序的指令系统索引表中涉及A、H、X、CCR等寄存器的操作未省略括号,请予注意,特别是对部分指令中涉及HX操作,要根据寻址方式来理解。附录中的指令系统索引表含有机器码、执行机器周期等信息,供必要时查阅。                

3.3.1 数据传送类指令 

(1) 取数指令

        取数指令的功能是取出存储器中的数放入寄存器A、X、HX中。同时按取出的数来改变N、Z标志,当取出的数为负(最高位为1)时,则负标志位N=1,当取出的数为0时,则零标志位Z=1。对其它标志位没有影响。LD是Load的简写,随后的字母是CPU内部寄存器名(LD与寄存器名之间没有空格)。

                                                                                                                                                                                           
        特别说明:addr8是指8位地址,或指在地址处于第0页(地址高8位为0)的变量,addr16是指16位地址,或指在地址处于非第0页(地址高8位不为0)的变量,实际编程时尽可能把常用的内存变量开辟在第0页,减少汇编后的程序长度。但把变量开辟在哪一页,对程序无明显影响。
        LDA、LDX是取一个字节的操作,均有8种寻址方式。LDHX是取两个字节的操作,只有2种寻址方式。
               LDHX #$36EF //把十六进制数36EF放入HX中
               LDHX $0058 //把$0058、$0059两个存储器单元的内容取到HX中
        特别说明:指令LDHX $0058的功能是一次读取两个存储器单元$0058、$0059中的数放入HX中,其中存储器单元$0058中的数被放入H中,存储器单元$0059中的数被放入X中。,数据存放时应注意这个特点。 

(2) 存数指令

        存数指令的功能是将寄存器A、X、HX的数,存入存储器单元中。对标志位的影响同上。ST是Store的简写,随后的字母是CPU内部寄存器名(ST与寄存器名之间没有空格)。

                                                                                                                                                                                            
        STA、STX是存一个字节的操作,均有7种寻址方式。STHX是存两个字节的操作,只有1种寻址方式。
STHX $00ED //把HX的内容存储到存储器$00ED、$00EE单元中

(3) 堆栈操作指令

       堆栈操作指令是将A、H、X进栈、出栈,不改变标志位。PSH是Push(推)的简写,PUL是Pull(拉)的简写,寄存器名A、H、X与简写字母之间没有空格。

                                                                                                                                                                                            

(4) 寄存器间数据传送指令

       这组指令为寄存器A、X、HX、SP、CCR之间的数据传送,不改变标志位。

                                                                                                                                                                                             

(5) 存储器间数据传送指令

        这组指令为存储器单元之间数据的直接传送,对标志位的影响情况是按传送的数来改变N、Z标志,当传送的数为负(最高位为1)时,则负标志位N=1,当传送的数为0时,则零标志位Z=1,对其它标志位没有影响。

 3.3.2 算术运算类指令

算术类指令有加、减、乘/除、加1/减1、求反/取补、比较、测试等。

(1) 加、减指令
加、减指令的第一操作数均在A中,第二操作数在存储器中(有8种寻址方式),结果均放在A中。根据运算结果改变V、H、N、Z、C标志位:
C 若有最高位的进位(减法为借位),则置位,否则清零。
V 若溢出,则置位,否则清零。
H 加法,若位3有进位,即半字节有进位,则置位,否则清零(减法不影响H)。
N 若结果的最高位为1,相当于有符号运算中的结果为负,则置位,否则清零。
Z 若结果为0,则置位,否则清零。
加法有不带进位加法(ADD)和带进位加法(ADC)两种,减法有不带借位减法(SUB)和带借位减法(SBC)两种。

 (2) 乘/除法指令

乘法指令MUL将X与A中两个无符号数相乘,结果是两个字节的无符号数,其高字节放入X中,低字节放入A中。同时清标志位H和C,不影响其它标志位。DIV指令将H、A中的二字节的无符号数除以X中的一个字节无符号数,商放入A中,余数放入H中。若商大于$FF,则置标志C,否则清C。若商为0,置标志Z,否则清Z。不影响其它标志位。

 (3) 加1/减1指令
INC类指令中INCA、INCX是寄存器的内容加1放回寄存器中,其它指令是把存储单元的内容加1之后放回原存储单元中,对标志位V、N、Z产生影响。DEC类指令与INC类指令类似,只是将上述指令中的“加1”改为“减1”,其它一致。

(4) 取反/求补指令
取反指令COM组指令中COMA、COMX是寄存器的内容取反后放回寄存器中,其它指令是把内存单元的内容取反后放回内存单元中。求补NEG组指令中NEGA、NEGX是寄存器的内容求补后放回寄存器中,其它指令是把内存单元的内容求补后放回内存单元中(求补即按位取反后加1)。COM与NEG对标志位影响与减法相同。


若A=$FF,执行COMA后,A=$00。若A=$00,执行COMA后,A=$FF。若A=$FF,执行NEGA后,A=$01。若A=$00,执行NEGA后,A=$00。那么,为什么取反用COM呢?这是One’s Complement的简写,是用$FF作为被减数。求补用NEG,是Negate—Two’s Complement的简写,用$00作为被减数,等于用$FF作为被减数,再加1。

(5) 比较指令
比较指令实质是减法操作,与减法不同的是,它不需要减法的结果,不改变任何操作数,只按运算结果改变V、N、Z、C标志位,改变的方式与减法指令相同。CMP的被减数是A、CPX的被减数是X、CPHX的被减数是HX,注意具有哪些寻址方式。CPHX是二字节比较指令,它将变址寄存器HX的内容与连续的两个存储器单元比较,相当于整数之间的比较。
编号 指令 操作 寻址方式

 
6) 清零指令
CLR组指令中CLRA、CLRX、CLRH是将寄存器清零,其它指令是将存储器单元清零,同时清零V、N标志位,置Z标志位,不改变H、I、C标志位。

 
(7) 测试是否为0指令
TST组指令中TSTA、TSTX是将寄存器的内容与零比较(实际是执行减0的操作),其它指令是把存储器单元的内容与零比较。这个指令执行后并不改变操作数本身,清C标志位,根据结果改变N、Z标志位,若操作数为负(即最高位为1),则N=1,否则N=0。 若操作数为0,则Z=1,否则Z=0。不影响其它标志位。

(8) SP与HX增加指令
AIS指令实现堆栈指针的直接增加,AIX指令实现变址寄存器的直接增加,两个指令均不影响标志位。

3.3.3 逻辑运算类指令

逻辑运算类指令完成逻辑与、或、异或等操作。这些指令把累加器A中的内容与存储器单元的内容进行运算后再送到累加器中,同时清零V标志位,根据运算结果改变N、Z标志位,不改变H、C标志位。与(AND)、或(ORA)、异或(EOR)指令均有8种寻址方式。

3.3.4 位操作类指令

位操作类指令主要是位测试、位置1、位清0等操作。位测试指令BIT与AND的区别是把累加器A中的内容与存储器单元的内容进行“与”运算后,结果不再送到累加器中,即它不改变参与运算的操作数,它清V标志位,根据运算结果改变N、Z标志位,不改变H、C标志位。可用于测试A和存储器单元的内容是否一致。BCLR、BSET两条指令可对存储器的起始256个单元的任一可读写的位执行清零或置位操作,它的位操作空间为2048个位,指令中n=7~0,指明一个字节的第几位,不影响任何标志位。这一功能在实际编程时很有用,因此尽可能把要进行位操作的变量开辟在第0页。CLC、SEC两条指令对标志位C进行清零或置位,不影响其它标志。CLI、SEI两条指令对中断屏蔽标志位I进行清零或置位,不影响其它标志。

3.3.5 移位类指令

移位类指令包括单向移位(含算术移位及逻辑移位)及循环移位两种类型,每种类型中均有右移及左移两种情况。

(1) 单向移位指令
在算术左移ASL指令中,ASLA、ASLX是对A、X进行左移,其它指令是对存储器单元的内容左移。它把8位操作数左移一位,首先将b7位移入C中,其它左移一位,0移入b0,相当于操作数乘以2。ASL指令与逻辑左移指令LSL功能完全相同,只是同一功能的不同名称。

算术右移指令ASR指令比较特别,它把要操作的字节当作有符号数,而符号位(b7)保持不变,其它位右移一位,即首先将b0位移入C中,其它位(b1~b6)右移一位,相当于操作数除以2。为了保证符号不变,ASR指令使符号位b7返回本身。逻辑右移指令LSR把8位操作数右移一位,首先将b0位移入C中,其它右移一位,0移入b7。
本组指令对标志位V、N、Z、C有影响,对标志位H、I没有影响。


(2) 循环移位指令
在循环左移指令ROL中,ROLA、ROLX是对A、X操作,其它指令是对存储器单元操作。借助C与b7~b0形成一个位序列,内部机制首先将C暂存起来,再将b7位移入C中,其它位左移一位,再将C移入b0。从b7~b0内部看来循环左移了一位,对标志位V、N、Z、C有影响,对标志位H、I没有影响。循环右移指令ROR与ROL移动方向相反。

3.3.6 程序控制类指令

程序控制类指令有一般转移指令、特殊转移指令、跳转指令及中断指令。

(1) 一般转移指令
下面第一组是标志位测试转移指令。它通过测试标志位,当满足条件时转移到程序中目标地址处执行,否则顺序执行,不影响标志位。
第二组是无符号数比较后转移指令,先执行两个无符号数的比较指令后,根据标志位的变化进行转移。不影响标志位。
第三组有符号数比较后转移指令,先执行两个有符号数的比较指令,根据标志位的变化进行转移。不影响标志位。
第四组BRCLR、BRSET是位测试转移指令,根据存储器单元某一位的情况进行转移。执行时,先把相应的位送入标志位C中,然后进行判断转移,对其它标志位没有影响。
第五组BRA是无条件相对转移指令,转移范围是前127字节、后128字节。BRA是Branch Always的简写。

2) 特殊转移指令
下面第一组是比较相等转移指令CBEQ(Compare and Branch if Equal)。进行比较后,直接根据两数是否相等,决定是否转移到目标地址处。不影响标志位。除CBEQA、CBEQX是A、X与立即数比较外,其它指令是A与存储器单元比较。
第二组是减1不为0转移指令DBNZ(Decrement and Branch if not Zero)。这是经常使用的指令,用于循环控制。这组指令首先对操作数进行减1运算,并放回原处,再与0进行比较,若不等于0则转移。不影响标志位。DBZNA、DBNZX是用A、X控制循环次数,DBNZ是用内存单元控制循环次数。 



(3) 跳转指令
下面第一组是无条件跳转指令JMP(Jump to Location)。可以方便地实现程序的散转功能,不影响标志位。
第二组转子程序指令JSR(Jump to Subroutine)。实现对子程序调用,在执行PC进栈时,操作如下:
(PC)+n→PC (n等于指令字节数,n=1、2或3)
PCL→SP; SP-1→SP;PCH→SP; SP-1→SP
新的地址→PC
JSR指令为绝对转移调用子程序,BSR为相对转移调用子程序。
第三组为从子程序返回指令(Return from Subroutine,RTS)。

3.3.7 其它指令

为方便起见,把未归入上述六类的指令划入其它指令类进行说明,包括中断指令、二~十进制编码指令、空操作指令等。
(1) 中断指令(Interrupt)


后一条是使A中的数高四位与低四位对调放回A中。而前一条DAA是对A中的数进行十进制调整,那么什么情况要进行这种调整呢?为什么要进行调整呢?

DAA是对A中BCD码加法结果进行调整。DAA执行下列操作:

若[(A0-3)>9或H=1],则(A0-3)←(A0-3)+$06
同时,若[(A4-7)>9或(C)=1],则(A4-7)←(A4-7)+$06
两个压缩型BCD码按二进制数相加,必须经本指令调整才能得到正确的压缩型BCD码的和值。下面对本指令进行说明。
对于十进制BCD码的加法运算,指令系统中没有专门的指令,只能以二进制加法指令进行BCD码运算。但二进制的加法运算原则不能完全适用于十进制的加法运算,有时会出错,例如:十进制(3+5=8),对应二进制(0011+0101=1000),正确,因为8的BCD码就是1000;但十进制(8+5=13),对应二进制(1000+0101=1101),不正确,因为BCD码中没有1101这个编码;又如,十进制(8+9=17),对应二进制(1000+1001=1 0001),不正确,因为(8+9=17)变成了11。原因是明显的,BCD码是四位二进制编码,而四位二进制编码共有十六个,但BCD码只用了前面的十个,后面六个没用。在BCD码加法中,一旦结果大于9就进入无效编码区,加法结果有进位,说明已跳过无效编码区。但不论哪种情况,都是相加的结果比正确值小6,因为出错是由于有六个无效编码造成的。DAA指令对此进行调整,具体原理不再赘述,调整方法是:①若A的低4位大于9,或辅助进位位H=1,则低4位加6修正;②若A的高4位大于9,或进位标志位C=1,则高4位加6修正。
总之,两个压缩型BCD码二进制数相加之后,必须经本指令调整才能得到正确的压缩型BCD码的和值。例:设A=$78,(HX)=$74,它们是BCD码,求相加后的BCD码:

执行指令: ADD ,X ;A =01111000+01110100=11101100
DAA ;调整,A的高低4位分别加0110,结果1 01010010
;C=1 A=$52,即152,正确


                                                                                                                                                                                            

<< 上一节  下一节>>                                      

相关链接


 
关于我们 | 诚邀加盟 | 客户服务 | 相关法律 | 网站地图 | 友情链接 | 服务信箱:service@eefocus.com
© 2006 与非门科技信息咨询(北京)有限公司 All Rights Reserved.