汇编语言怎么给寄存器赋值累加器a是八位的,可以被32位r0赋值吗,如何赋值的呢,毕竟只有8位?

一种单片机所能识别的全部指令集合,就称为该单片机的指令系统或指令集。单片机时钟振荡器电路产生的时钟信号,经内部4分频后形成一个不重叠的方波信号Q1~Q4,叫作4个节拍,由4个节拍构成一个指令周期Tcyc,一个指令周期内部包含4个时钟周期Tosc。前一个指令周期内完成取值操作,在后一个指令周期内完成指令的译码和执行。当Q1节拍的上升沿出现时,程序计数器PC增1,指令码是在Q4节拍取出并放入指令寄存器的。指令码的译码和执行贯穿下一个指令周期的Q1~Q4节拍。由于单片机在执行一条指令的同时,就可以提取下一条指令,从而实现流水作业,这样,每一条指令的运行时间平均为一个指令周期,因此习惯上说单片机采用的是单周期指令。严格地说,大多数指令的运行时间都是一个指令周期,但是少数引起程序执行顺序发生跳转的指令则是两个周期。

通常,每一条指令都用指意性很强的英文单词或缩写来代表,将代表一条指令的一个字符串称为“助记符”。PIC16F627共有35条指令,均是长度为14位的单字节指令,按其操作对象的不同可分为3类,即面向字节操作类(17条)、面向位操作类(4条)以及常数操作和控制操作类(14条)。

代表工作寄存器(即累加器)

代表7位寄存器单元地址,最多可区分128个单元

表示某一bit在一个寄存器内部8bit数据中的位置(即伴地址),由3位组成

代表8bit数据常数,或者代表11位地址常数

代表目标寄存器:d=0,目标寄存器为W;d=1,目标寄存器为f

表示运算结果送入目标寄存器

代表逻辑“异或”运算符

3类指令代码格式如下:

1)面向字节操作类指令代码分配格式:

2)面向位操作类指令代码分配格式:

3)常数操作和控制操作类指令代码分配格式:又分3种情况。

⑴携带8bit常数的指令代码分配格式:

⑵携带13比特常数的CALL和GOTO指令代码分配格式:

⑶不携带常数的指令代码分配格式:(如NOP)

2. 面向字节操作类指令:

操作:W+f→d,影响状态位:C、DC、Z
说明:将寄存器f和工作寄存器W的内容相加,d=1结果存入寄存器f中,d=0存入W
操作:W∧f→d,影响状态位:Z
说明:将寄存器f和工作寄存器W的内容相与,d=1结果存入寄存器f中,d=0存入W
操作:0→W,影响状态位:Z
说明:将寄存器清零。d=0,f和W同时清零;d=1,仅f被清零
工作寄存器W清零指令:CLRW
操作:0→W,影响状态位:Z
说明:将W寄存器清零,状态位被置1。
操作:~f→W,影响状态位:Z
说明:将寄存器f的内容取反。d=1,结果存入寄存器f中;d=0,存入工作寄存器W中
操作:f-1→d,影响状态位:Z
说明:将寄存器f的内容减1。d=1,结果存入寄存器f中;d=0,存入工作寄存器W中
操作:f-1→d,结果为0则跳转,不影响状态位,产生跳转时指令周期为2
说明:将寄存器f的内容减1存入d。结果为0则跳过下一条指令执行,否则顺序执行下一条指令(单周期)。
操作:f+1→d,影响状态位:Z
说明:将寄存器f的内容加1。d=1,结果存入寄存器f中;d=0,存入工作寄存器W中
操作:f+1→d,结果为0则跳转,不影响状态位,产生跳转时指令周期为2
说明:将寄存器f的内容加1存入d。结果为0则跳过下一条指令执行,否则顺序执行下一条指令(单周期)。
操作:W∨f→d,影响状态位:Z
说明:将寄存器f和工作寄存器W的内容做逻辑或运算,d=1结果存入寄存器f中,d=0存入工作寄存器W中
寄存器逻辑异或指令:XORWF f,d
操作:W⊕f→d,影响状态位:Z
说明:将寄存器f和工作寄存器W的内容相异或,d=1结果存入寄存器f中,d=0存入工作寄存器W中
操作:f→d,影响状态位:Z
说明:将寄存器f内容送至工作寄存器W(d=0)或自己本身(d=1),如果是传给自己,一般是用来影响状态位Z,以判断寄存器f是否为0
操作:W→f,不影响状态位
说明:将工作寄存器W的内容送到寄存器f中。
说明:不产生任何结果,只使PC+1。
寄存器带进位位循环左移指令:RLF f,d
说明:将寄存器f接位循环左移,结果存入d。f最高位(bit7)移入状态位C(进位位),进位位C移入d(0)中。
寄存器带进位位循环右移指令:RRF f,d
说明:将寄存器f接位循环右移,结果存入d。f最低位(bit0)移入状态位C(进位位),进位位C移入d(7)中。
操作:f-W→d,影响状态位:C、DC、Z
说明:将寄存器f的内容减去工作寄存器W的内容,d=1结果存入寄存器f中,d=0存入工作寄存器W中。(该指令是将工作寄存器W的内容求补后与寄存器f的内容相加)
说明:将寄存器f内容的高4位和低4位相交换,d=1结果存入寄存器f中,d=0存入工作寄存器W中。

3. 面向位操作类的指令:

4. 面向常数操作和控制操作类指令:

操作:W+K→W,影响状态位:C、DC、Z
说明:将立即数K和工作寄存器W的内容相加,结果存入工作寄存器W中
常数逻辑与指令:ANDLW K
操作:W∧K→W,影响状态位:Z
说明:将立即数K和工作寄存器W的内容相与,结果存入工作寄存器W中
常数逻辑与指令:ANDLW K
操作:W∧K→W,影响状态位:Z
说明:将立即数K和工作寄存器W的内容相与,结果存入工作寄存器W中
子程序调用指令:CALL K
说明:调用子程序。返回地址(PC+1)被压入堆栈,11位立即数地址被装入PC(10:0),PC的高位从PCLATCH装入,指令周期为2。
看门狗定时器清零指令:CLRWDT
操作:0→WDT,0→预分频器
说明:复位看门狗,还将复位WDT的预分频器。状态位TO和PD被置1。
指令执行前 WDT计数器=?
无条件跳转指令:GOTO K
说明:常数K(地址)置入PC低11位,PC高位装入PCLATCH(4:3),如果程序存储器大于2K,且目标程序位于不同的页面,那么在执行GOTO指令前,PCLATCH必须装入子程序的页号。指令周期为2。
常数逻辑或指令:IORLW K
操作:W∨K→W,影响状态位:Z
说明:将立即数K和工作寄存器W的内容做逻辑或操作,结果存入工作寄存器W中
操作:K→W,不影响状态位
说明:将立即数K送入工作寄存器W中
中断返回指令:RETFIE
操作:堆栈顶→PC,不影响状态位
说明:从中断返回,并将位于栈顶的返回地址写入PC。指令周期2。
子程序带值返回指令:RETLW K
操作:K→W,堆栈顶→PC,不影响状态位
说明:将立即数K送到工作寄存器W中,并将位于栈顶的返回地址写入PC,适合查表。指令周期2。
指令执行后 W=K8的值
子程序返回指令:RETURN
操作:堆栈顶→PC,不影响状态位
说明:从子程序返回。执行出栈操作,将位于栈顶的单元内容装入PC。指令周期2。
说明:停止OSC1进入低功耗模式。各端口引脚没有输出。
操作:K-W→W,影响状态位:C、DC、Z
说明:用立即数K减去工作寄存器W的内容,结果存入工作寄存器W中。(该指令是将工作寄存器W的内容求补后与立即数K相加)
操作:W⊕K→W,影响状态位:Z
说明:立即数K和工作寄存器W的内容做逻辑异或,结果存入工作寄存器W中
还有2条指令,但为了保持与将来型号的向上兼容性,建议不要使用,这是为了与旧型号PIC16C5X产品代码兼容。
操作:(W)→OPTION,不影响状态位
说明:将工作寄存器W的内容装入到OPTION寄存器。OPTION是可读写的寄存器,用户可对其直接寻址,例如用MOVWF指令。
操作:(W)→TRIS寄存器f,不影响状态位
说明:将工作寄存器W的内容装入到TRIS寄存器。TRIS是可读写的寄存器,用户可对其直接寻址。

指令是由操作码和操作数组成的,操作数是指令的一个重要组成部分,用于指定参与运算的数据或者数据所在的单元地址。所谓寻址方式,就是寻找操作数的方法,就是获取操作数所在地址的方法。PIC16F62X的指令系统中,根据操作数的来源不同,设计了4种寻址方式。

1)立即寻址:指令码中携带着实际操作数(立即数)。
2)直接寻址:指令码中有寄存器单元的地址
3)间接寻址:对映射寄存器INDF的操作
示例:XORWF INDF,1 ;将FSR内容所指向地址的内容与W内容相异或
对INDF的操作就是对间接寻址寄存器FSR所表示的地址所指向的单元的内容进行操作。
4)位寻址:对任意寄存器中的任一比特位直接寻址访问
示例:BSF 05H,4 ;把地址为05H的寄存器单元内的第b4位设置为1。

所谓汇编语言,就是用助记符来表示二进制代码。单片机仅仅能够识别二进制形式的机器语言程序(机器码程序),但如果直接用机器语言来设计程序,编写起来很繁琐且容易出错,也给程序的阅读、修改、调试等环节带来极大的困难。所以,在开发单片机程序时通常都使用汇编语言。
汇编语言是对机器语言的改进,采用便于人们记忆的一些符号来表示操作码、操作数和地址码等。汇编语言的语句通常与机器语言指令一一对应。单片机并不能识别汇编语言,需要用编译软件将汇编语言编写的程序翻译成机器语言程序,被称为“目标程序”,然后烧写进单片机。
标号: 操作码(指令助记符) 操作数 ; 注释
汇编语言源程序既可以用大写字母书写,也可以用小写字母书写,还可以大小写混用,一个语句行最多允许有225个半角字符。
标号:就是该条指令的符号地址,是在编译时被赋以该指令在程序寄存器中所存放的具体地址。只有那些将被其他语句引用的语句才需要加标号,标号可以单独作为一行。标号最多由32个字母、数字和其他一些字符组成,第一个字符必须是字母或下划线,必须从一行的第一列开始写,后面用空格、制表符或换行符与操作码隔开。标号不能用指令助记符、寄存器代号或其他在系统中已有固定用途的字符串。一个标号在程序中只能定义一次。
操作码:操作码可以是指令系统中的助记符,也可以是用于控制汇编器的伪指令。操作码前面至少保留一个空格,以便于标号区别。
操作数:操作数是操作对象,也就是数据或者地址,可以用常数或符号两种形式表示。常数,可以是二进制、八进制、十进制、十六进制或者字符;符号,可以是在此之前经过定义(或者赋值)的代表数据或地址的标号、字符串。如果操作数有两个,中间要用逗号分开。
注释:注释可有可无,但最好附带注释,便于阅读、交流、修改和调试程序。注释用半角分号与指令部分分开,编译器对该部分不作任何处理。
MPASM的默认进制是十六进制,十六进制数由数字0~9和字母A~F组成。当在程序中采用后缀H表示一个以A~F开头的十六进制数时,则必须在它前面增添一个0作为先导,以便编译器将其与符号名相区分。二进制数要以B为后缀,八进制以Q或O为后缀,十进制数则以D为后缀。字符,要用单引号括住,字符代表的常数就是该字符的ASCII码。

所谓伪指令,并不是单片机的真实指令,没有对应的机器码,仅在编译过程中起作用。伪指令,是程序设计人员向编译器发出的控制指令,告诉编译器如何完成汇编过程和一些规定的操作,以及控制编译器的输入、输出和数据定位等。MPASM可以使用的伪指令有十多条。
EQU:符号名赋值伪指令。格式:符号名 EQU xxH
即给符号名赋予一个特定值或者说是给符号名定义一个数值。格式中的符号名通常是代表寄存器名称或专用常数的一个字符串,xxH通常是一个不大于8bit二进制数的数值。一个符号名一旦由EQU赋值,其值就固定下来了,不能再被重新赋值。符号名应从一行的第一列开始书写,其后至少保留一个空格与EQU隔离。
ORG:程序起始地址定义伪指令。格式:ORG xxxxH
用于指定该伪指令后面的源程序存放的起始地址,也就是编译后的机器码目标程序在单片机的程序存储器中开始存放的首地址。xxxxH是一个13bit长的地址参数。
END:程序结束伪指令。
END伪指令通知编译器MPASM结束对源程序的编译。一个源程序中必须要有并且只有一条END伪指令,放在整个程序的末尾。

程序,按其执行顺序,可分为顺序结构、分支结构、循环结构和子程序结构4种。
计算机执行程序时表现为从头至尾严格按照次序一条语句一条语句地顺序执行,并且每一条语句均被执行一遍。
程序设计中,对某一段程序重复执行多遍。一个循环程序结构包含循环初态设置、循环体和循环控制三部分。循环初态设置就是在循环开始时,指定或定义一个循环变量(可以是循环次数计数器、地址指针等),并且给它设置一个初始值;循环体为要求重复执行的程序段;循环控制就是根据循环结束条件判断是否结束循环。在循环程序中必须给出循环结束条件,否则就成为“死循环”。
实际程序中,常常会遇到一些完全相同的计算和操作,可以编制成标准化的程序段,存储于程序存储器的指定区域,在每次需要时调出使用,这种程序段就称为子程序。
PIC系列单片机编程时,在主程序的适当地方放置CALL指令来实现跳转,在子程序的开头需要使用地址标号,作为子程序的名称,末尾用RETURN或RETLW指令,以便子程序的调用和子程序的返回。在子程序调用子程序时,会遇到参数传递和现场保护问题。
所谓参数传递,就是在调用子程序前,主程序应先把有关参数放到某些约定的存储器单元,进入子程序后就可以从约定的单元取出有关参数加以处理。处理完之后,子程序也应把处理结果送到约定单元。在返回主程序后,主程序可以从这些约定单元获得所需结果。在主程序和子程序之间传递8位参数是,工作寄存器W是理想的选择。
所谓现场保护,就是主程序在运行过程中使用了一些寄存器来存放临时数据(或中间结果),在子程序运行过程中有时也要用到这些寄存器,为了避免对于主程序还有用的临时数据被子程序覆盖,就要设法保护这些临时数据。在执行完子程序返回主程序时,还要恢复这些数据,这成为现场保护。对应PIC单片机,一般是用合理分配寄存器单元的办法,避免子程序的数据和主程序的数据发生冲突,这样可以省略现场保护和现场恢复的过程。

10. 常用程序示例:

《计算机组成原理与汇编语言程序设计》

一、掌握:CPU基本组成模型(寄存器组成、数据通路结构),同步控制方式与常见时序信号,微命令(脉冲、电位),熟练掌握指令流程(能拟出给定指令的流程)。

首先在掌握上述概念的基础上,结合教材图3-13熟悉模型机的构成(最好分成几大块记忆理解)。

重点了解组合逻辑控制器的设计步骤,就可以掌握有关的指令流程,下面一一加以介绍。首先根据指令系统分析每条指令的流程,写出每一条指令所对应的微操作序列。对所有微操作进行逻辑综合与化简,写出每个微操作的逻辑表达式。根据这些逻辑表达式,对微操作控制信号形成部件进行逻辑设计。

1.确立模型机的指令系统

(1)工作周期(机器周期)

下载文档原格式(Word原格式,共23页)

  • 个人网站、项目部署、开发环境、游戏服务器、图床、渲染训练等免费搭建教程,多款云服务器20元起。

我要回帖

更多关于 汇编语言怎么给寄存器赋值 的文章

 

随机推荐