Phimas

HCS12 介绍讲义3——指令集

0
阅读(4728)

目的:
- 解释典型应用程序中如何有效地使用HCS12 CPU模块
目标:
- 描述的HCS12 CPU的编程模型
- 识别方法有效地访问HCS12的存储器映射
- 说明如何有效地使用HCS12的寻址模式
- 停止模式等待模式描述用途和功能
- 确定HCS12的CPU功能,支持高层次语言课程
条件:
- 处理器,内存,寄存器I / O功能的基本认识

 

 

本模块将讨论所有CPU12指令让读者能够汇编语言编写例程

CPU12说明M68HC11指令集一个一个M68HC11编写的代码可以重新组合和CPU12运行没有变化 CPU12提供扩展的功能和提高代码效率两个实现CPU12M68HC12HCS12的这两个实现都具有相同的指令集,虽然有小的差异周期访问的细节一些改变,以适应指令队列实现方式差异总线周期顺序对于大多数用户来说是透明的这些细微的差别
M68HC12和HCS12体系结构所有的内存输入/输出(I / O映射一个共同64 KB的地址空间内存映射I / O这使得同一套指令被用来存取记忆体I / O和控制寄存器通用负载存储传输交换,移动指令数据存储器和外设方便运动
CPU12全套8位16位数学指令
8位,16位一些较大的操作数符号和无符号运算,除法和乘法指令
特别算术和逻辑指令援助堆叠操作,索引,二进制编码的十进制(BCD)计算条件码寄存器操纵也有专用指令的乘法和累加操作插值专门模糊逻辑运算涉及数学计算

大部分指令的标准68xx已添加了一些新的/高效率的操作码
课程结构和进度支持一回基本指令集介绍没有到其他课程材料切割
这里我们将简要介绍CPU12指令集,以帮助读者了解演习计划的例子在这个会议
CPU12支持以下指令类型
数据处理:载入,存储,拉,推,TRANDFERSINC,DEC旋转和移位
运算:ADD,SUBMULT
逻辑:AND,OR提高采收率
数据测试位测试,比较
分支:有条件分行BNEBHI
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寄存器入栈

拉操作工程完全相反

HCS12DP256RAM的结束位置$3FFF $ 4000的SP通常是一个不错的选择由于堆栈增长向低内存地址

传送指令寄存器累加器内容复制到另一个寄存器累加器的内容不会改变的操作转移登记册登记(TFR)是一种普遍转移指令其他助记符M68HC11兼容接受
转移到BTab)转移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指令作为循环计数器
多精度计算
无符号值运行唯一的BEQBNELBEQLBNE分行可以预计持续执行运行所有签署分支

清除补充和否定指令
每个明确,补充,否定指令执行一个特定二进制运算累加器在内存中
清除行动的明确值设置为0补充业务取代的补和否定操作取代价值它的两个补充
南德集团(2的补影响N,Z,V,C
   - 替换2的补Accx或M的内容“的价值是左$ 80 UNCHNAGED
COM1的补/反转所有位只影响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位仅要清除BCLRBCLR ANDS的面具操作

最大和最小指示
最大(MAX)和最小(MIN)指令用于累加器一个内存位置之间比较这些
可用于线性规划操作指令,如
单纯形优化模糊化
MAX和MIN指令使用累加器一个执行8位
比较EMAX和Emin指令使用累加器D到
执行16位比较结果最大值或最小值
可以存储在累加器EMAXDEMINDMAXAMINA)或
内存地址EMAXMEMINMMAXMMINM

例如:循环MINA的1 X +
                   BHS的循环
这个例子比较寄存器和内存X寄存器指出一个地点操作数内存低于寄存器的值,循环结束较低的值内存加载到寄存器
MIN和MAX指令的操作数是符号
根据操作结果更新标志N,Z,V和C的CCR

移位和旋转指令

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

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

分支指令
分支指令序列改变满足特定条件(S)会导致程序 CPU12使用3分支指令这些短枝长枝,并位条件分支
分支指令也可以为了要采取一个分支,必须满足条件类型分类有些指令属于一个以上的分类例如:
时采取比较无符号数量测试结果在一个特定的组合条件码寄存器无符号分支
签署数量特定条件码寄存器组合结果比较或测试时采取签名分行
例如:
下一页:CMPX +;比较指出一个记忆体位置(X)
BNE下一步;如果没有平等循环返回到下一
上面的例子比较寄存器AX寄存器指出内存位置
该计划将循环,直到在内存中价值发现,比较寄存器A
CPU12支持两种类型的分支机构短期和长期的短枝使用一个8位有符号偏移量添加到程序计数器(PC条件得到满足跳转范围+127到-128的位置
长枝使用使CPU的分支64K的存储器映射任何地方16位有符号偏移
 
 
 


 

循环的原始指令
该循环也可以被认为是作为计数器分支 
指令测试计数器的值一个寄存器或累加器A,BD,X
Y或SP为零非零作为一个分支条件
这些预减,预递增,测试版本
说明。
8位偏移数字范围$80(-128$ 7F127
偏移值一个内存位置地址

范例:
- 
MOVW2,Y +,X +
DBNEð
- 
上面的例子内存位置数据移动指出寄存器YX寄存器指向内存位置X和Y寄存器将递增,由两个指向内存中下一个单词
BDNE指令减去一个'1'循环计数器寄存器D如果循环计数器尚未递减到“$ 0000,该方案将继续循环

条件转移指令
内存字节位条件分支
一个特定的状态掩码操作是用来测试的位置如果所有
该位置对应面具BRSET)或
清除BRCLR分支
8位偏移数字范围$80(-128$ 7F(127
偏移值一个内存位置地址

范例:

            等待BRCLR PORTDX $80等待

上述指令测试端口D的第7位在这短短的循环直到该位被置例子这个指令有用的投票端口引脚状态,甚至是I / O设备标志

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

介绍:乘法指令
幻灯片上说明登记老年退休金计划
校本评核SUBSA,B,D)影响N,Z,V,C
SUBC使用以前进行价值作为借在当前减法
MUL8x8的无符号乘法一个16位结果
MUL需要10个时钟根据第7位ACCB的第7位16位结果影响C位
问题什么是C位代表在减法

16/16无符号整数除法或有符号
描述:除以一个无符号/有符号(取决于是否使用IDIVIDIVS一个无符号/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,如果股息>除数,如果除数= 0C = 1。

扩展除法32/16无符号的有符号
描述除以一个32位无符号/有符号的一个16位除数(取决于是否使用EDIVEDIVS股息产生一个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和ORCCR​​的操作
一个很好的例子重新启用中断执行CLI指令执行的第一条指令禁用中断

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

 

 

 

START  LDX  #$