单片机位操作的逻辑运算详解
单片机位操作的逻辑运算详解
从51单片机转到其他的芯片时,总会遇到一个非常郁闷的问题,就是其他芯片有的也许没有位操作。
所以
最大的问题就是通过逻辑操作来改变一个字节的某个位。
于是在这里总结一下关于位操作的一些表达式。
首先,对一个字节,8位也好,16位也好,32位也好,
只有两种操作,一种叫置位,一种叫清零。
先从置位说起。
置位可以对全部位进行操作,也可以对某个位进行操作。
全部操作很简单直接赋值就ok了。
我们假设一个无
符号字符型uchar为8位。
且最低位为0,也就是说0-7位,而不是1-8位,那么改变值的状态只需要直接等于
就ok了
uchar a=0;
a=0xfe;
这样的话,就让a的低1-7位置1,a的0位不变
但这样做有一个问题,我每次改变数值时,还要先打开
计算器,然后设置到2进制功能,然后要把我要选择的
位输入进去,比如100,然后按16进制功能。
然后计算
器显示4。
我觉得这样很麻烦。
咋办呢,结果前辈们就
想出了一个法子。
通过位移的方法改变一个为,就变成
了这样
uchar a=0;
a = (1<<5);
这样做的话,就把a的第6位(注意是第6为不是第5位,因为数据最低位是0,而不是1,因为我总是搞混,所以也告诫大家,小心着方面的错误,如果搞混,你的数据有可能出错)置1。
那么a的值用2进制表示的话那就是00100000b,那么可能又会有人问,如果我想把第2和第3位置1怎么办呢?那么你可以这样
uchar a=0;
a = (3<<1);
这样做的意思是将二进制(11)位移到第二位的地方。
那么第二位,是第一个1,第三位是第二个1。
同理假如让第3位和低5位为1,第4位为0,怎么办。
uchar a=0;
a = (5<<2);
这样就可以实现101位移到第3位了,以上,基本是置位的大概操作了,当然这只是一次性的。
也就是说,如果我希望1次只操作一个位,比如当a=00000001b时,我希望a的第二位也置1,且第一位仍然保持1,怎么办呢?那也有办法,可以采用与操作。
例如:a为1,我希望a的第2位置1,且第1位保持不变,那么
uchar a=1;
a |= (1<<1);
这样就可以达到想要的结果了。
然我们来看看,这是为什么?
首先,a=1,变成二进制时,a=00000001b
然后再看下面的那个表达式
a |= (1<<1);
分析一下,看过c语言相关书籍的人大概都知道这个一
个含有复合的赋值运算符的表达式。
这个式子可以拆成:a=a|(1<<1);
这样就不难理解了,(1<<1)的意思是把1左移1位,那么结果就是10b,把这个结果在和a进行或操作,我们知道或操作是同为0结果才是0。
a
00000001
或操作 00000010
结果
00000011
所以这个公式就可以使在不改变a=1的情况下,再使
a的第2位变成1,这样的结果就是a=3。
这就是这个公
式的大概原理。
不仅这个,我还可以分别对两个不同的位进行操作。
所
以我可以这样:
uchar a=1;
a |= (1<<2)|(1<<3)|(1<<4)|(1<<5);
这样的话,就可以把第3、4、5、6位全部置1,而且保持a的第1位不变,这个公式的最终结果是00111101b。
同样,这招,在全部置位也有效。
但是a原来的值就消
失了
uchar a=1;
a = (1<<2)|(1<<3)|(1<<4)|(1<<5);
那么结果只有4个1,00111100b,第1位的一就没有了
同样比如(3<<1)也可以出现在单一置位当中
uchar a=1
a |= (3<<1);
这个表达式结果为00000111b。
到这,置位操作,基
本上就都在这了,大多数程序,这几个方法也够了,这
也是晚上普遍的方法,也许还有其他的方法,如果你知道,希望能够通知我。
下面说说清0,清0可以用(&=~),举个例子:
uchar a=0xfe;
a &=~ (1<<4);
让我们来分析一下这个式子,首先这和上面一样,是一个含有复合的赋值运算符的表达式。
拆开来以后
a=a&(~(1<<4))
这个式子比刚才要复杂一些,让我们先来看看括号最里面的(1<<4)
结果为10000b,然后我们把这个式子取反,因为a是8
位的,所以结果被转换成11101111b,然后我们在把a和这个结果进行与运算。
因为与运算的规律是全1为1。
a
11111110b
与操作
11101111b
结果
11101110b
现在,我们清楚了这个结果时怎么来的了。
同样同时使两位变为0也可以通过(3<<5)来实现,比如
uchar a=0xfe;
a &=~ (3<<4);
这样也是可以得到希望的结果的,但是需要注意一下,(1<<2)|(1<<3)|(1<<4)|(1<<5),像这种一位一位的变则需要注意一下了。
因为清零中先需要取反,所以如果希
望一位一位的变,则需要用括号,把结果扩起来,形成
一个值,然后再取反,才能得到想要的结果了。
比如
uchar a=0xfe;
/*
注意,这样做是不对的,结果只会把第二位清0,
a &=~ (1<<2)|(1<<3)|(1<<4)|(1<<5);
*/
a &=~ ((1<<2)|(1<<3)|(1<<4)|(1<<5));
这样做才能达到希望的效果。
可能大家会想,用(&=)会得到啥样的结果呢?这我试了一下
uchar a=0xfe
a &= (1<<4);
首先(1<<4),结果是10000,然后再进行与操作
a
11111110b
与操作 00010000b
结果
00010000b
这个结果不是我们想要的,不过这个结果可以达到屏蔽我们不要的位,比如在判断中,判断最高位是否为1,可以采用这样的语句
if(a&0x80)
这句话,如果a的最高位为1,则为真,如果最高位不为1,则为假,如果位最高位为1的话,结果为10000000,在c语言中不为0,则为真,所以判定某位是否为1时,可以采用&操作。
以上就是简单的总结了一下置位,清零的逻辑操作的方法。
单片机的内部结构及工作原理解析
单片机的内部结构及工作原理解析单片机(Microcontroller)是指集成了中央处理器(CPU)、存储器(ROM、RAM)、输入/输出(I/O)接口和定时器/计数器等功能模块的一种超大规模集成电路。
在现代电子设备中,单片机已经广泛应用于各个领域,如家电、智能设备、汽车电子等。
而了解单片机的内部结构及工作原理,对于进行嵌入式系统开发和电子产品设计具有重要的意义。
一、内部结构单片机主要分为中央处理器(CPU)、存储器、输入/输出接口(I/O)和定时器/计数器等几个主要部分。
1. 中央处理器(CPU):单片机的核心部分是CPU,它负责执行各种指令并控制整个单片机的操作。
CPU主要包括运算器、控制器和时序发生器。
运算器是负责执行各种运算操作的部分,包括算术运算、逻辑运算等。
控制器负责解析和执行指令,控制整个系统的工作。
时序发生器则负责产生各种时钟信号来同步整个系统的工作。
2. 存储器:单片机中的存储器分为可编程只读存储器(Programmable Read-Only Memory,PROM)、只读存储器(Read-Only Memory,ROM)和随机存储器(Random Access Memory,RAM)等几种类型。
PROM用于存储程序代码和常量数据,ROM用于存储不可更改的程序代码和数据,而RAM用于存储临时变量、中间结果等。
存储器的容量和类型取决于单片机的规格和需求。
3. 输入/输出接口(I/O):单片机通过输入/输出接口与外部设备进行数据交换。
输入接口用于接收外部信号或数据,如按键、传感器等。
输出接口用于向外部设备发送信号或数据,如LED灯、液晶显示器等。
单片机通常提供多个通用输入/输出引脚(General Purpose Input/Output,GPIO)来扩展外部设备的连接。
4. 定时器/计数器:定时器和计数器是单片机中重要的功能模块,用于产生精确的时间延迟和计数功能。
定时器用于产生周期性的定时信号,计数器则用于对外部事件的计数。
单片机的工作过程以及原理
单片机的工作过程以及原理单片机是一种专用的小型计算机芯片,它集成了处理器核心、存储器和各种外设接口等组成部分。
它广泛应用于嵌入式系统中,是现代电子产品中的重要组成部分。
本文将详细介绍单片机的工作过程和原理。
一、单片机的工作过程:1.初始化阶段:初始化是单片机启动的第一个阶段,其目的是准备单片机所需的各种资源。
在这个阶段,单片机会执行一系列预定义的操作,如清除寄存器、设置工作模式、配置外设接口等。
2.执行阶段:执行阶段是单片机进行计算、控制和通信等任务的阶段。
在这个阶段,单片机根据程序的指令和数据,通过寄存器、算术逻辑单元(ALU)和存储器等功能模块进行计算、存储和控制。
单片机的执行可以分为两个层次:指令层和操作层。
(1)指令层:指令层是单片机执行的最基本单位,包括指令的获取、解码和执行等过程。
指令的获取是指从存储器中读取指令,并将其送入指令寄存器中。
单片机采用顺序读取的方式获取指令,即按照指令的地址从存储器中读取指令,并将地址自动增加,以获取下一条指令。
指令的解码是指根据指令的格式和功能,将其解析成相应的操作。
单片机根据指令的操作码和操作数,通过控制逻辑单元将指令解码成相应的操作。
指令的执行是指根据指令的操作,进行计算、存储和控制等操作。
单片机根据指令的操作码和操作数,通过寄存器和算术逻辑单元进行相应的运算和存储,同时进行控制相关的外设接口。
(2)操作层:操作层是单片机执行的高级单位,包括各种操作的组合和执行过程。
在操作层,单片机根据程序的逻辑和需要,进行各种任务的操作。
例如,单片机可以进行算术运算、逻辑运算、移位运算、存储和读取数据等。
同时,单片机可以通过外设接口与外部设备进行通信和控制。
例如,单片机可以通过串口和计算机进行通信,通过IO口控制LED灯和蜂鸣器等外设。
3.终止阶段:终止阶段是单片机工作的最后阶段,其目的是释放已占用的资源,并保存必要的状态信息。
在这个阶段,单片机会执行一些清理工作,如关闭外设接口、保存相关寄存器的值等。
Holtek(合泰)单片机指令介绍
影响标志:Z
INCA [m]
指令说明:
RAM
[m]+1
ALU Shifter
ACC
影响标志:Z
减1指令
DEC [m]
指令说明:
RAM
[m]-1
ALU Shifter
影响标志:Z
DECA [m]
指令说明:
RAM
[m]-1
ALU Shifter
ACC
影响标志:Z
…
……
〈例〉
RAM
辑单元) – STATUS (Status register 状态寄存器) – STACK (Stack register 堆栈寄存器)
MCU概述 指令系统概述 HOLTEK指令系统
指令系统概述
分类 寻址方式 指令周期 状态寄存器 指令中的常用符号
分类
HOLTEK8位系列单片机共有63条功能强大的 汇编指令。这些指令按功能可分为以下七类。
RRC [m]
指令说明:
RAM
STATUS
ALU Shifter
MSB
LSB
76543210 C
D7 D6 D5 D4 D3 D2 D1 D0 C
76543210 C C D7 D6 D5 D4 D3 D2 D1 D0
影响标志:C
RRCA [m]
指令说明:
RAM
STATUS
ALU Shifter
影响标志:Z
ORM A,[m]
指令说明:
RAM
ALU ACC“OR”[m] Shifter
ACC
影响标志:Z
OR A,X
指令说明:
ROM
ALU Shifter
ACC“OR”X
单片机指令简介了解单片机指令的基本概念和作用
单片机指令简介了解单片机指令的基本概念和作用单片机指令简介:了解单片机指令的基本概念和作用单片机(Microcontroller)是一种集成了微处理器核心、存储器和各种输入输出接口的单芯片微型计算机系统。
指令是单片机进行操作和执行任务的基本单位,了解单片机指令的基本概念和作用对于学习和应用单片机具有重要意义。
本文将针对单片机指令进行简要介绍,帮助读者初步了解单片机指令的基本特点和用途。
一、单片机指令的概念单片机指令是一条具有特定功能的机器指令,它为单片机提供执行操作的命令。
单片机指令一般由指令操作码(Opcode)和操作数组成。
指令操作码表示了该指令的功能和操作类型,而操作数则提供了指令所需的数据。
单片机指令可以分为不同的类型,例如控制指令、算术指令、逻辑指令等,每种指令都对应了特定的功能和操作。
二、单片机指令的作用1. 控制功能:单片机指令可以用于控制外部设备的操作。
通过设置特定的指令,可以实现对输入输出端口的读写、定时中断和通信控制等功能,从而达到控制外部设备的目的。
2. 运算功能:单片机指令可以进行各种算术和逻辑运算。
通过执行特定的指令,单片机可以进行加减乘除运算、位移操作、逻辑运算等,使得单片机可以完成各种复杂的计算任务。
3. 程序控制功能:单片机指令可以用于实现程序的控制和流程的跳转。
通过执行特定的指令,单片机可以根据不同的条件进行分支和循环,实现程序的不同执行路径和流程控制。
4. 存储和检索功能:单片机指令可以用于读取和写入存储器的数据。
通过执行特定的指令,单片机可以访问和操作存储器中的数据,例如读取变量的值、保存计算结果等。
5. 中断处理功能:单片机指令可以用于中断处理。
通过设置特定的指令和中断向量表,单片机可以响应外部中断信号,暂停当前任务的执行,转而执行中断服务程序,处理相应的中断事件。
三、单片机指令的特点1. 简洁高效:单片机指令通常采用二进制编码,执行速度快,运算效率高。
由于单片机的硬件资源有限,指令的长度和功能都经过优化设计,使得指令的执行效率更高,能够实现各种实时控制任务。
单片机c语言的结构体实现字节、位操作
单片机c语言的结构体实现字节、位操作结构体是C语言中一种数据类型,它可以包含不同类型的数据成员。
结构体可以通过位操作和字节操作来进行操作。
1. 字节操作:字节操作主要是针对结构体中的整型数据成员。
可以使用位与(&)和位或()操作来读取或设置结构体中某个字节的值。
示例代码:c#include <stdio.h>定义一个结构体typedef struct {unsigned char byte1;unsigned char byte2;unsigned char byte3;unsigned char byte4;} MyStruct;int main() {MyStruct myStruct;读取第二个字节的值unsigned char secondByte = myStruct.byte2;printf("Second byte: %d\n", secondByte);设置第三个字节的值为10myStruct.byte3 = 10;return 0;}2. 位操作:位操作主要是针对结构体中的位字段数据成员。
可以使用位操作符(<<,>>,&,)来对位字段进行读取和设置。
示例代码:c#include <stdio.h>定义一个结构体typedef struct {unsigned char flag1 : 1;unsigned char flag2 : 1;unsigned char flag3 : 1;unsigned char flag4 : 1;} MyStruct;int main() {MyStruct myStruct;设置第一个位字段为1myStruct.flag1 = 1;读取第二个位字段的值unsigned char secondFlag = myStruct.flag2;printf("Second flag: %d\n", secondFlag);return 0;}通过结构体的字节操作和位操作,可以对结构体中的字节和位字段进行精确的操作。
51单片机超详细教程PPT
51单片机超详细教程PPT目录•51单片机概述•51单片机硬件结构•指令系统与汇编语言编程•C语言编程与实例分析•中断系统与定时器/计数器应用•接口技术与应用扩展•调试技巧与故障排除方法0151单片机概述Part单片机定义与发展定义单片机是一种集成电路芯片,将微处理器、存储器、输入输出接口等集成在一块芯片上,构成完整的计算机系统。
发展历程从早期的4位、8位单片机,到如今的32位、64位高性能单片机,单片机的性能不断提升,应用领域也不断扩展。
51单片机特点及优势特点51单片机采用8051内核,具有高性能、低功耗、易于扩展等优点;同时拥有丰富的外设接口和强大的中断处理能力。
优势51单片机在嵌入式系统领域具有广泛的应用,其稳定的性能和成熟的生态系统使得开发者能够快速开发出高质量的嵌入式应用。
应用领域与市场需求应用领域智能家居、工业自动化、医疗设备、汽车电子、物联网等。
市场需求随着物联网、人工智能等技术的快速发展,对单片机的性能、功耗、安全性等方面提出了更高的要求。
同时,市场对于单片机的定制化、差异化需求也日益增加。
0251单片机硬件结构Part中央处理器CPU运算器进行算术运算和逻辑运算控制器取指、译码、执行指令,控制程序流程寄存器组暂存数据和地址,加速CPU 运算速度STEP 01STEP 02STEP 03存储器组织程序存储器存放变量、中间结果等,一般使用RAM实现数据存储器特殊功能寄存器用于控制单片机的各种功能,如定时器、中断等存放程序代码和常数表格等,一般使用ROM或EPROM实现I/O 端口与外部设备通信的接口,分为并行I/O 和串行I/O 两种要点一要点二特殊功能寄存器用于控制I/O 端口的操作,如设置端口模式、读取端口状态等I/O 端口及特殊功能寄存器时钟电路提供单片机运行所需的时钟信号,一般由晶振和电容组成复位电路使单片机在启动时或异常情况下恢复到初始状态,一般由电阻和电容组成时钟电路与复位电路03指令系统与汇编语言编程Part指令格式及寻址方式指令格式由操作码和操作数组成,操作码指明操作性质,操作数表示操作对象。
dp901单片机指令大全
dp901单片机指令大全
DP901是一款高性能8位单片机,芯片采用CMOS工艺制造,具有低功耗、高速、可靠性强等特点。
以下是DP901单片机指令大全:
数据传送指令
MOV:将数据从源操作数传送到目的操作数。
ADD:将源操作数加上目的操作数,结果放在目的操作数中。
SUB:将源操作数从目的操作数中减去,结果放在目的操作数中。
INC:将目的操作数加1。
DEC:将目的操作数减1。
CLR:将目的操作数清0。
CPL:将目的操作数按位取反。
分支指令
JZ:如果零标志位为1,则跳转到目的地址。
JNZ:如果零标志位为0,则跳转到目的地址。
JC:如果进位标志位为1,则跳转到目的地址。
JNC:如果进位标志位为0,则跳转到目的地址。
SJMP:无条件跳转到目的地址。
逻辑运算指令
AND:按位与运算。
OR:按位或运算。
XOR:按位异或运算。
NOT:按位取反。
数字运算指令
MUL:无符号乘法。
DIV:无符号除法。
DA:BCD码数值加法。
数据存储指令
PUSH:将数据压入栈中。
POP:将数据从栈中弹出。
XCH:交换两个操作数的值。
中断控制指令
EI:开中断。
DI:关中断。
RET:中断返回。
第3章 MCS-51单片机指令系统
(1)内部数据存储器的低128个字节单元 (00H~7FH)。例: MOV A, 40H ,表示把内 部RAM 40H单元的内容传送给A。 假设40H单元中的内容为2BH,结果是将直接地 址40H单元中的数据2BH传送到累加器A中。
第三章 MCS-51单片机指令系统
3.2.2 直接寻址
(2)特殊功能寄存器。 特殊功能寄存器只能用直接寻址方式进行访问。 对于特殊功能寄存器,在助记符指令中可以直接 用符号来代替地址。例: MOV A, P0 ,表示把 P0口(地址为80H)的内容传送给A。
3.3.1 内部数据存储器传送指令
1.立即数传送指令
MOV A,#data ;A←data MOV Rn,#data ;Rn←data,n=0~7 MOV direct,#data ;direct←data MOV @Ri,#data ;(Ri)←data,i=0,1 MOV DPTR,#data16 ;DPTR←data16 前四条指令将8位立即数传送到指定的存储单元中。 最后一条指令将16位立即数传送到数据指针 DPTR中,其中高8位送入DPH,低8位送入DPL。
(3)三字节指令 编码格式为:
例如数据传送指令MOV 20H,#3AH的编码格式为:
3.2 寻址方式
第三章 MCS-51单片机指令系统
所谓寻址,就是寻找操作数的真正地址,寻址方 式,就是指寻找操作数地址的方式。
在用汇编语言编程时,数据的存放、传送、运算 都要通过指令来完成。 编程者必须自始至终都要 十分清楚操作数的位置, 以及如何将它们传送到适 当的寄存器去参与运算。每一种计算机都具有多 种寻址方式。寻址方式的多少是反映指令系统优 劣的主要指标之一。
2. 汇编语言
汇编语言就是用助记符表示的指令,汇编语言与 机器语言一一对应。用汇编语言编写程序,每条 指令的意义一目了然,给程序的编写、阅读和修 改带来很大方便。而且用汇编语言编写的程序占 用内存少,执行速度快,尤其适用于实时应用场 合的程序设计。因此,在单片机应用系统中主要 是用汇编语言来编写程序。 汇编语言的缺点:缺乏通用性,程序不易移植, 是一种面向机器的低级语言。使用汇编语言编写 程序时,必须熟悉机器的指令系统、寻址方式、 寄存器的设置和使用方法。每种计算机系统都有 它自己的汇编语言。不同计算机的汇编语言之间 不能通用。
51单片机汇编指令总结
51单片机汇编指令总结数据传输指令一.片内RAM数据传输指令1.以累加器A为目的操作数的指令:MOV A , RnMOV A , directMOV A , @RiMOV A , #data2.以寄存器Rn为目的操作数的指令:MOV Rn , AMOV Rn ,directMOV Rn ,data3.以直接地址为目的操作数的指令:MOV direct ,AMOV direct ,RnMOV direct1 ,derect2MOV direct ,@RiMOV direct ,#data4.间接地址为目的操作数的指令:MOV @Ri ,AMOV @Ri ,directMOV @Ri ,#data5.十六位数据传送指令:MOV DPTR , #data16二.累加器A与片外RAM数据传送指令:MOVX A ,@RiMOVX A , @DPTRMOVX @Ri ,AMOVX @DPTR ,A三.查表寻址:MOVC A ,@A+DPTR (先PC←(PC)+1,后A←((A)+(DPTR)))+MOVC A ,@A+PC (先PC←(PC)+1,后A←((A)+(PC)))四.交换指令:1.字节交换指令:XCH A ,RnXCH A ,directXCH A ,@Ri2.半字节交换指令:XCHD A ,@Ri3.累加器半字节交换指令:SWAP A五.栈操作指令:1.PUSH(入栈指令)PUSH direct2.POP(出栈指令)POP direct算术运算指令:一.加法减法指令:1.加法指令:ADD A ,RnADD A ,directADD A ,@RiADD A ,#data2.带进位加法指令:ADDC A ,Rn A←(A)+(Rn)+CYADDC A ,direct A←(A)+(direct)+CYADDC A ,@Ri A←(A)+((Ri))+CYADDC A ,#data A←(A)+(data)+CY3.带借位减法指令:SUBB A ,Rn A←(A)-CY-(Rn)SUBB A ,direct A←(A)-CY-(direct)SUBB A ,@Ri A←(A)-CY-((Ri))SUBB A ,#data A←(A)-CY-#data二.乘法除法指令:1.乘法指令:MUL AB BA←(A) ×(B)高字节放在B中,低字节放在A中2.除法指令:DIV AB A←(A) ÷(B)的商,(B) ←(A) ÷(B)的余数三.加1减1指令:1.加1指令:INC A A←(A)+1INC Rn Rn←(Rn)+1INC direct direct←(direct)+1INC @Ri (Ri) ←((Ri))+1INC DPTR DPTR←(DPTR)+12.减1指令:DEC ADEC RnDEC directDEC @Ri四.十进制调制指令:DA A 调整累加器A的内容为BCD码逻辑操作指令:一.逻辑与、或、异或指令:1.逻辑与指令:ANL A ,RnANL A ,directANL A ,@RiANL A ,#data2.逻辑或这令:ORL A ,RnORL A ,directORL A ,@RiORL A ,#dataORL direct ,AORL direct ,#data3.逻辑异或指令:XRL A ,RnXRL A ,directXRL A ,@RiXRL A ,#dataXRL direct ,AXRL direct ,#data二.清零、取反指令:1.累加器A清零指令:CRL A2.累加器A取反指令:CPL A三.循环位移指令:1.累加器A循环左移指令:RL A2.累加器A循环右移指令:RR A3.累加器A连同进位位循环左移指令:RLC A4. 累加器A连同进位位循环右移指令:RRC A控制转移指令:一.无条件转移指令:1.绝对转移指令:AJMP addr11 (先PC+2,然后将addr11的低十位传给PC,PC的高六位不变)2.长转移指令:LJMP addr16 (用addr16的值替换PC的值)3.相对转移(短转移)指令:SJMP rel(带符号的偏移字节数)(PC+2,再加rel赋值给PC)4.间接转移指令:JMP @A+DPTR (A)+(DPTR) →(PC)二.条件转移指令:1.累加器判零转移指令:JZ rel 先PC+2;后判断,A为0时转移,PC+rel赋值给PC;否则顺序执行JNZ rel 先PC+2,后判断,A不为0时转移,PC+rel赋值给PC;否则顺序执行2.比较转移指令:CJNE 目的操作数,源操作数,relCJNE A,direct,rel 先PC+3传回PC,再比较目的操作数和原操作数CJNE A,#data,rel 目>源时,程序转移,PC+rel传回PC且CY=0CJNE Rn,#data,rel 目=源时,程序顺序执行CJNE @Ri,#data,rel 目<源时,程序转移,PC+rel传回PC且CY=13.减一非0指令:DJNZ Rn,rel 先PC\+2,Rn-1,当Rn为0时程序顺序执行,否则PC+rel传回PCDJNZ direct,rel 先PC+3,direct-1,direct为0时程序顺序执行,否则PC+rel 传回PC二.子程序调用、返回指令:1.绝对调用指令ACALL:ACALL addr11 先PC+2,SP+1将PC的低八位存入SP;SP+1,将PC的高八位存入SP。
单片机乘法运算(汇编)
在计算机中,乘法运算是一种很重要的运算,有的机器由硬件乘法器直接完成乘法运算,有的机器内没有乘法器,但可以按机器作乘法运算的方法,用软件编程实现、因此,学习乘法运算方法不仅有助于乘法器的设计,也有助于乘法编程。
下面从分析笔算乘法入手,介绍机器中用到的几种乘法运算方法。
(1)分析笔算乘法:设A=0.1101,B=0.1011,求A×B。
笔算乘法时乘积的符号由两数符号心算而得:正正得正;其数值部分的运算如下:所以A×B=+0.10001111可见,这里包含着被乘数4的多次左移,以及四个位积的相加运算。
若计算机完全模仿笔算乘法步骤,将会有两大困难:其一,将四个位积一次相加,机器难以实现;其二,乘积位数增长了一倍,这将造成器材的浪费和运算时间的增加。
为此,对笔算乘法做些改进。
(2)笔算乘法的改进:将A?B= A?0.1011=0.1A+0.001?A+0.0001?A=0.1A+0.00?A+0.001(A+0.1A)=0.1A+0.01[0?A+0.1(A+0.1A)]=0.1{A+0.1[0?A+0.1(A+0.1A)]}=2-1{A+2-1 [0?A+2-1 (A+2-1A)]}=2-1{A+2-1 [0?A+2-1 (A+2-1(A+0))]}由上式可见,两数相乘的过程,可视作加法和移位(乘2-1相当于做一位右移)两种运算,这对计算机来说是非常容易实现的。
从初始值为0开始,对上式作分步运算,则第一步:被乘数加零A+0=0.1101+0.0000=0.1101第二步:右移一位,得新的部分积2-1 (A+0)=0.01101第三步:被乘数加部分积A+2-1(A+0)=0.1101+0.01101=1.00111第四步:右移一位,得新的部分积2-1 A+2-1 (A+0)=0.100111第五步:0?A +2-1 [A+2-1 (A+0)] =0.100111第六步:2-1{0?A+2-1 [A+2-1 (A+0)]}=0.0100111第七步:A+2-1{0?A+2-1 [A+2-1 (A+0)]}=1.0001111第八步:2-1 {A+2-1[0?A+2-1 (A+2-1 (A+0))]}=0.10001111上述运算过程可归纳为:①乘法运算可用移位和加法来实现,当两个四位数相乘,总共需做四次加法和四次移位。
