HCS12 介绍讲义3——指令集
0赞
目的:
- 解释在典型的应用程序中如何有效地使用HCS12 CPU模块
目标:
- 描述的HCS12 CPU的编程模型。
- 识别方法,有效地访问HCS12的存储器映射。
- 说明如何有效地使用HCS12的寻址模式。
- 停止模式和等待模式描述的用途和功能。
- 确定HCS12的CPU功能,支持高层次的语言课程。
条件:
- 处理器,内存,寄存器和I / O功能的基本认识
本模块将讨论所有CPU12指令,让读者能够在汇编语言编写短例程。
CPU12说明M68HC11指令集的一个超集。一个M68HC11编写的代码可以重新组合和CPU12运行,没有变化。 CPU12提供扩展的功能和提高代码效率。有两个实现的CPU12,原M68HC12和新的HCS12的。这两个实现都具有相同的指令集,虽然有小的差异在逐周期访问的细节(一些改变,以适应在指令队列实现方式的差异总线周期的顺序)。对于大多数用户来说是透明的,这些细微的差别。
在M68HC12和HCS12体系结构,所有的内存和输入/输出(I / O)映射到一个共同的64 KB的地址空间(内存映射I / O)。这使得同一套指令被用来存取记忆体,I / O和控制寄存器。通用负载,存储,传输,交换,移动指令和数据存储器和外设方便的运动。
CPU12有全套的8位和16位的数学指令。
有8位,16位,和一些较大的操作数的符号和无符号运算,除法和乘法指令。
特别的算术和逻辑指令援助堆叠操作,索引,二进制编码的十进制(BCD)计算,条件码寄存器操纵。也有专用指令的乘法和累加操作,表插值,和专门的模糊逻辑运算,涉及数学计算。

大部分指令的标准68xx,但已添加了一些新的/高效率的操作码
课程结构和进度,不支持一回,基本指令集介绍,没有到其他课程材料的切割。
在这里,我们将简要介绍CPU12指令集,以帮助读者了解演习和计划的例子,在这个会议。
CPU12支持以下指令类型:
数据处理:载入,存储,拉,推,TRANDFERS,INC,DEC,旋转和移位。
运算:ADD,SUB,MULT
逻辑:AND,OR提高采收率
数据测试:位测试,比较
分支:有条件的分行,BNE,BHI
JUMP和分支就业选配计划,JSR
条件代码清除或设置位
参考文献:CPU12用户手册
文件CPU12RM/AD
www.mot.com/ MCU

载入指令存储器的内容复制到一个累加器或寄存器。
记忆的内容是不会改变的操作。负载指示(但
不LEA_指令)影响条件码位,所以没有单独的测试
说明需要检查为负数或0的条件下加载值。
LEA指令计算出一个有效的地址,并放入一个目标寄存器。下面的例子:
LEAX乙,Y增加了寄存器B寄存器Y并放入寄存器十,既不B或Y的内容,此操作的影响的总和。
寄存器Y= $ 1000
B寄存器= $ 25
存储指令复制一个CPU寄存器内存的内容。
注册/累加器的内容是不会改变的操作。商店
指令自动更新N和Z条件码位,这
可以消除在某些程序中的一个单独的测试指令的需要。

推拉说明:
PUSH指令保存到堆栈区的登记册的内容。
由一个或取决于是否寄存器的大小,分别是8位或16位两个堆栈指针递减。寄存器的内容,然后将其存储在地址的SP点。
PUSH指令是常用的一个或多个CPU寄存器的内容保存在一个子程序的启动。互补拉指令可用于恢复之前保存的CPU寄存器从子程序返回。
推送操作不影响条件码寄存器(CCR)。
拉指令常用在一个子程序结束,恢复CPU寄存器入栈子程序执行前的内容。
拉指令不影响条件码注册,除非CCR是拉。
问题:
我们使用什么类型的寻址与PSHA等?????
当我们将要使用PSH和PUL??
推送操作是上面的描述。请注意,递减堆栈指针(SP),是由两个和X寄存器入栈。
拉操作工程推完全相反。
HCS12DP256,RAM的结束位置$3FFF。 $ 4000的SP通常是一个不错的选择,由于堆栈增长向低内存地址。

传送指令寄存器或累加器的内容复制到另一个寄存器或累加器。源的内容是不会改变的操作。转移登记册登记(TFR)是一种普遍的转移指令,但其他助记符与M68HC11兼容接受。
转移到B(Tab)和乙转移(TBA)指令影响的N,Z和V条件同样的方式在M68HC11指令代码位。总和生育率指令不影响条件码位。
符号扩展的8位操作数(性)指令是一个通用传送指令,是用来签署延长8位的补码,使他们可以在16位操作使用的特殊情况。 8位号码是从累加器A,累加器B,或条件码寄存器的X索引寄存器,Y索引寄存器,堆栈指针的蓄电池研发,复制。所有的16位结果的高字节位的8位数字的最显著的位(MSB)。的价值。
交换指令对寄存器或蓄电池交换的内容。当在一个EXG指令的第一个操作数是8位和第二个操作数是16位,8位执行一条零扩展操作注册,因为它是复制到16位寄存器。

减量和增量指令优化的8 - 位和16位加法和减法操作。他们一般都是用来实现计数器。
递增和递减指令添加一个或减1,内存位置或寄存器的内容。
的N,Z和V状态位设置或清除操作的结果。 C状态位是不影响操作,从而使INC和DEC指令作为循环计数器
多精度计算。
无符号值运行时,唯一的BEQ,BNE,LBEQ,和LBNE分行可以预计持续执行。补值运行时,所有签署的分支。

清除,补充和否定指令:
每个明确,补充,否定指令执行一个特定的二进制运算在累加器或在内存中的值。
清除行动的明确值设置为0,补充业务取代它的补值和否定操作取代价值与它的两个补充。
南德集团(2的补)影响N,Z,V,C
- 替换其2的补Accx或M的内容“的价值是左$ 80 UNCHNAGED”
COM(1的补/反转所有位)只影响N,Z和清除V,集彗星
替换Accx或M的内容,其1的补
- CLR(写0到操作数)清除N,V,C,并设置Z。
- Accx或M的内容都放在0
- BSET,BCLR使用/ CLR的内存操作数位(S)指令的操作数掩码设置1。
BCLR - 明确的多个位,在位置M. cleard位掩码字节的指定。
BSET - 设置多个位,在位置M.指定要设置的位掩码字节1。
BSET和BCLR指令影响N,Z,及清除五,叶彗星不受影响。
用户试图使用位操作,以清除定时器系统状态标志。 (定时器标志位通过写1到标志后,读它,清除它虽然是1)。我对你使用BSET指令,你可能会清除超过拟标志,因为你会在事实清楚任何标志的寄存器发生在BSET指令的操作数的读周期,不只是位的面具集BSET指令。你可以使用一个面具,有0位仅要清除BCLR。BCLR ANDS的面具的逆操作。

最大和最小的指示
最大(MAX)和最小(MIN)指令用于累加器和一个内存位置之间的比较。这些
可用于线性规划操作指令,如
单纯形法优化,模糊化。
MAX和MIN指令使用累加器一个执行8位
比较,而EMAX和Emin指令使用累加器D到
执行16位的比较。结果(最大值或最小值)
可以存储在累加器(EMAXD,EMIND,MAXA,MINA)或
内存地址(EMAXM,EMINM,MAXM,MINM)。
例如:循环MINA的1 X +
BHS的循环
这个例子比较寄存器和内存X寄存器指出一个地点。当操作数是内存低于寄存器的值,循环结束,和较低的值是从内存加载到寄存器。
MIN和MAX指令的操作数是无符号。
根据操作结果更新标志N,Z,V和C的CCR。

移位和旋转指令:
有移位和旋转所有累加器和字节内存。
所有通过的C状态位移了位,以方便多字节操作。由于逻辑和算术左移是相同的,有没有单独的逻辑左移操作。逻辑左移(LSL)的助记符组装算术左移内存(ASL)操作。
ROL,ROR - 通过进位旋转
列伊(向左旋转) - 轮班Accx或M一个地方的所有位向左
ROR(向右旋转) - 轮班Accx或M一个地方的所有位向右
没有16位的旋转为ACCD
LSX,ASX,ROX所有影响N,Z,V,彗星
劳基法与ASL的是相同的操作与使用相同的操作码
翔升 - 在Accx或M一个地方转移到左边的所有位
ASR的 - 算术移位权利
所有的的Accx或M一个地方转移到正确的位0 - > C&第7位保持不变
左移 - >有效的方式来乘以2的幂
右移 - >有效的方式来除以2的幂

比较和测试指令执行一对之间的减法
寄存器或寄存器和存储器之间。其结果是不会保存,但
操作条件代码。这些指令
一般用于建立分支指令的条件。在这
架构,大多数指令自动更新条件代码位,
所以它往往是不必要的,包括单独测试或比较
说明。

分支指令序列改变当满足特定条件(S)时,会导致程序。 CPU12使用3种分支指令。这些短枝,长枝,并位条件分支。
分支指令,也可以为了要采取的一个分支,必须满足的条件类型分类。有些指令是属于一个以上的分类。例如:
时采取比较或无符号数量的测试结果,在一个特定的组合条件码寄存器位无符号分支。
签署数量在特定的条件码寄存器位组合的结果比较或测试时采取的签名分行。
例如:
下一页:CMP,X +;比较指出一个记忆体位置(X)
BNE下一步;如果没有平等的循环返回到下一
上面的例子比较寄存器A与X寄存器指出的内存位置。
该计划将循环,直到在内存中的价值发现,比较寄存器A
CPU12支持两种类型的分支机构,短期和长期的。短枝使用一个8位有符号偏移量添加到程序计数器(PC)的值的条件得到满足时。跳转范围从+127到-128的位置。
长枝使用,使CPU的分支在64K的存储器映射的任何地方16位有符号偏移。
循环的原始指令
该循环原语也可以被认为是作为计数器的分支。 “
指令测试计数器的值在一个寄存器或累加器(A,B,D,X,
Y或SP)为零或非零值作为一个分支条件。有
这些预减,预递增,测试版本
说明。
8位偏移值的数字范围是$80(-128)$ 7F(127)
从偏移值后的下一个内存位置的地址。
范例:
-
环MOVW2,Y +,X +
DBNEð,环
-
上面的例子,从内存位置的数据块移动指出寄存器Y到X寄存器指向的内存位置。X和Y寄存器将递增,由两个指向内存中的下一个单词。
BDNE指令减去一个'1'循环计数器寄存器D,如果循环计数器尚未递减到“$ 0000”,该方案将继续循环。

位条件转移指令
当内存字节的位位条件分支
一个特定的状态。掩码操作数是用来测试的位置。如果所有位
该位置,对应的面具(BRSET)或
清除(BRCLR),分支。
8位偏移值的数字范围是$80(-128)$ 7F(127)
从偏移值后的下一个内存位置的地址。
范例:
等待BRCLR PORTD,X $80等待
上述指令测试端口D的第7位,在这短短的循环,直到该位被置的例子。这个指令是有用的投票端口引脚的状态,甚至是I / O设备标志。

加上&十进制调整指令:
ABY - 这是罕见的地方之一,摩托罗拉的指令集不完全是一般的。
您可以添加B到X或Y,但你不能添加一个X或Y ABY计算offsetts到多维数组。
如果你想要做的X或Y16位算术只是XGDX然后如ADDD16位算术,然后XGDX。注意X作为温度为D在此SEQ。
阿坝和添加(A,B,D)影响N,Z,C,V
ABX ABY(ACCB已添加到索引寄存器)不影响CCR
ABX及ABY指向索引寄存器新(计算)地址(ACCA添加到索引寄存器是不可用)
ADDC作为附加在携带使用目前除了先前进行的价值
DAA是唯一使用后立即执行ADDA,改造累加器的十六进制结果使用半进位十进制。

介绍:减和乘法指令
幻灯片上的说明都登记老年退休金计划
校本评核及SUBS(A,B,D)影响N,Z,V,C
SUBC使用以前进行价值作为借在当前的减法
MUL是8x8的无符号乘法,一个16位的结果
MUL需要10个时钟,根据第7位(ACCB的第7位的16位结果及影响C位)
问题:什么是C位代表在减法:
16/16无符号整数除法或有符号
描述:除以一个无符号/有符号(取决于是否使用IDIV或IDIVS),一个无符号/16位双累加器D中的股息签署了在索引寄存器X16位除数,产生一个无符号/有符号的16位商X和一个无符号/有符号了在D如果除数和被除数都假定,在相同的位置小数点的16位余数,商数的小数点0位权。在分工的情况下
C是零,设置,商是设置为$ FFFF的,其余indeterminate.Condition代码:IDIV,Z = 1,如果智商= 0,C= 1,如果除数=0 FDIV,Z = 1商数=0时, V = 1,如果股息>除数,如果除数= 0,C = 1。
扩展除法32/16无符号的或有符号。
描述:除以一个32位无符号/有符号的一个16位除数(取决于是否使用EDIV或EDIVS)股息,产生一个16位无符号/有符号的智商和一个无符号/有符号的16位余。位于CPU寄存器的所有操作数和结果。
如果试图除以零,双累加器D和索引寄存器Y的内容没有改变,C设置的N,Z,和V位在CCR的状态是不确定的。
有用的A / D和D / A计算结果值可以比较比例A / D结果,结果是正确的形式,带动加权D / A

小数除法指令:
- FDIV IDIV后执行,以解决其余部分:事实上FDIV可以按照另一个FDIV解决过去基数位。
比例A / D和D/ A值也表达作为模拟参考小数部分的模拟值的加权二进制分数。例如$ C000意味着3 / 4或0.75(基数为10)的参考价值。这个想法也延伸到百分比计算。
- FDIV旨在用于股息<除数(即小数结果)
如果FDIV成功,则商(X寄存器)= 0,其余16位是在ACCD的分数值。
如果FDIV失败(股息>除数),然后商数(X寄存器)= $ FFFF和其余是不确定的。

EMACS的指令:
该指令允许乘以two16位操作数产生一个32位的中间结果的乘法和累加操作。这32位的中间结果,然后添加到内存中的一个32位累加器的内容。
Emacs是一个有符号整数操作。位于内存中的所有操作数和结果。 Emacs的指令执行时,第一个源操作数是一个由X指向的地址取自,第二个源操作数是从指出,通过索引寄存器Y。指令执行前地址提取,X和Y索引寄存器必须包含指向源操作数的最显著的字节的值。 32位的结果,最重要的字节是指定的指令提供一个扩展地址。
Emacs的指令可能是有用的DSP应用,都需要极高的速度的,因为指令需要13专时钟执行。

布尔逻辑指令
布尔逻辑指令执行之间的逻辑运算
8位累加器或CCR和内存值。 AND,OR和
异或函数支持。
AND指令可用于屏蔽掉不必要的操作数位。 OR指令可用于设置而异或指令可用于切换操作数位操作数位。

JUMP(JMP)指令导致程序序列的即时变化。 JMP指令装载一个64 KB的内存映射地址的PC,并在该地址继续执行程序。这个地址可以提供一个绝对的16位地址,或通过各种形式的索引寻址确定。
子程序指令优化的控制权转交给执行特定任务的代码段的过程。短分支(BSR),跳转到子程序(JSR),或扩充内存调用(CALL)可以用来启动子程序。有没有LBSR指令,但一个相对PC JSR执行相同的功能。返回地址是堆放,然后开始执行子程序地址。在正常的64 KB的地址空间的子程序返回,从子程序指令(RTS)终止。转运站unstacks返回地址,以便继续执行的指令后,BSR或JSR。
在扩展内存(CALL)指令调用子程序的目的是扩展内存的使用。调用栈在PPAGE寄存器和返回地址的值,然后写入一个新的价值PPAGE选择内存页的子程序所在。页面的值是一个索引间接模式以外的所有寻址模式立即数,在这些模式中,操作数在内存中的位置,新的页面价值和存储子程序地址。
致电(RTC)指令的回报是用来终止扩展内存的子程序。 RTC的unstacksPPAGE价值和返回地址,以便继续执行调用后的下一条指令。
软件兼容性,CALL和RTC正确执行,没有扩展寻址能力的设备。

条件代码寄存器指令:
这些指令允许用户操纵一个特殊的位或位在CCR。
您可以设置或清除一个特殊的位,将累加器A寄存器CCR或AND和OR与CCR的操作数。
一个很好的例子,将重新启用中断或执行CLI指令执行的第一条指令禁用中断。

读者应该尝试完成上面的程序填补空白。

START LDX #$
