造价通

反馈
取消

热门搜词

造价通

取消 发送 反馈意见

单片机其他基础知识

2018/06/19177 作者:佚名
导读: 本段仅针对硬件设计人员和软件设计人员,为了便于对硬件的理解要有一定的汇编语言基础。 总线 我们知道,一个电路总是由元器件通过电线连接而成的,在模拟电路中,连线并不成为一个问题,因为各器件间一般是串行关系,各器件之间的连线并不很多,但计算机电路却不一样,它是以微处理器为核心,各器件都要与微处理器相连,各器件之间的工作必须相互协调,所以需要的连线就很多了,如果仍如同模拟电路一样,

本段仅针对硬件设计人员和软件设计人员,为了便于对硬件的理解要有一定的汇编语言基础。

总线

我们知道,一个电路总是由元器件通过电线连接而成的,在模拟电路中,连线并不成为一个问题,因为各器件间一般是串行关系,各器件之间的连线并不很多,但计算机电路却不一样,它是以微处理器为核心,各器件都要与微处理器相连,各器件之间的工作必须相互协调,所以需要的连线就很多了,如果仍如同模拟电路一样,在各微处理器和各器件间单独连线,则线的数量将多得惊人,所以在微处理机中引入了总线的概念,各个器件共同享用连线,所有器件的8根数据线全部接到8根公用的线上,即相当于各个器件并联起来,但仅这样还不行,如果有两个器件同时送出数据,一个为0,一个为1,那么,接收方接收到的究竟是什么呢?这种情况是不允许的,所以要通过控制线进行控制,使器件分时工作,任何时候只能有一个器件发送数据(可以有多个器件同时接收)。器件的数据线也就被称为数据总线,器件所有的控制线被称为控制总线。在单片机内部或者外部存储器及其它器件中有存储单元,这些存储单元要被分配地址,才能使用,分配地址当然也是以电信号的形式给出的,由于存储单元比较多,所以,用于地址分配的线也较多,这些线被称为地址总线。

数据地址指令

这三者的本质都是一样的——数字,或者说都是一串‘0’和‘1’组成的序列。换言之,地址、指令也都是数据。指令:由单片机芯片的设计者规定的一种数字,它与我们常用的指令助记符有着严格的一一对应关系,不可以由单片机的开发者更改。地址:是寻找单片机内部、外部的存储单元、输入输出口的依据,内部单元的地址值已由芯片设计者规定好,不可更改,外部的单元可以由单片机开发者自行决定,但有一些地址单元是一定要有的(详见程序的执行过程)。数据:这是由微处理机处理的对象,在各种不同的应用电路中各不相同,一般而言,被处理的数据可能有这么几种情况:

1.地址(如MOV DPTR,1000H),即地址1000H送入DPTR。

2.方式字或控制字(如MOV TMOD,#3),3即是控制字。

3.常数(如MOV TH0,#10H)10H即定时常数。

4.实际输出值(如P1口接彩灯,要灯全亮,则执行指令:MOV P1,#0FFH,要灯全暗,则执行指令:MOV P1,#00H)这里0FFH和00H都是实际输出值。又如用于LED的字形码,也是实际输出的值。

理解了地址、指令的本质,就不难理解程序运行过程中为什么会跑飞,会把数据当成指令来执行了。

P0/P2/P3功能

初学时往往对P0口、P2口和P3口的第二功能用法迷惑不解,认为第二功能和原功能之间要有一个切换的过程,或者说要有一条指令,事实上,各端口的第二功能完全是自动的,不需要用指令来转换。如P3.6、P3.7分别是WR、RD信号,当微处理机外接RAM或有外部I/O口时,它们被用作第二功能,不能作为通用I/O口使用,只要一微处理机一执行到MOVX指令,就会有相应的信号从P3.6或P3.7送出,不需要事先用指令说明。事实上‘不能作为通用I/O口使用’也并不是‘不能’而是(使用者)‘不会’将其作为通用I/O口使用。你完全可以在指令中按排一条SETB P3.7的指令,并且当单片机执行到这条指令时,也会使P3.7变为高电平,但使用者不会这么去做,因为这通常会导致系统的崩溃。

程序执行过程

单片机在通电复位后8051内的程序计数器(PC)中的值为‘0000’,所以程序总是从‘0000’单元开始执行,也就是说:在系统的ROM中一定要存在‘0000’这个单元,并且在‘0000’单元中存放的一定是一条指令。

堆栈

堆栈是一个区域,是用来存放数据的,这个区域本身没有任何特殊之处,就是内部RAM的一部份,特殊的是它存放和取用数据的方式,即所谓的‘先进后出,后进先出’,并且堆栈有特殊的数据传输指令,即‘PUSH’和‘POP’,有一个特殊的专为其服务的单元,即堆栈指针SP,每当执一次PUSH指令时,SP就(在原来值的基础上)自动减2,每当执行一次POP指令,SP就(在原来值的基础上)自动加2。由于SP中的值可以用指令加以改变,所以只要在程序开始阶段更改了SP的值,就可以把堆栈设置在规定的内存单元中,如在程序开始时,用一条MOV SP,#5FH指令,就是把堆栈设置在从内存单元60H开始的单元中。一般程序的开头总有这么一条设置堆栈指针的指令,因为开机时,SP的初始值为07H,这样就使堆栈从08H单元开始往后,而08H到1FH这个区域正是8031的第二、三、四工作寄存器区,经常要被使用,这会造成数据的混乱。不同作者编写程序时,初始化堆栈指令也不完全相同,这是作者的习惯问题。当设置好堆栈区后,并不意味着该区域成为一种专用内存,它还是可以象普通内存区域一样使用,只是一般情况下编程者不会把它当成普通内存用了。

开发过程

这里所说的开发过程并不是一般书中所说的从任务分析开始,我们假设已设计并制作好硬件,下面就是编写软件的工作。在编写软件之前,首先要确定一些常数、地址,事实上这些常数、地址在设计阶段已被直接或间接地确定下来了。如当某器件的连线设计好后,其地址也就被确定了,当器件的功能被确定下来后,其控制字也就被确定了。然后用文本编辑器(如EDIT、CCED等)编写软件,编写好后,用编译器对源程序文件编译,查错,直到没有语法错误,除了极简单的程序外,一般应用仿真机对软件进行调试,直到程序运行正确为止。运行正确后,就可以写片(将程序固化在EPROM中)。在源程序被编译后,生成了扩展名为HEX的目标文件,一般编程器能够识别这种格式的文件,只要将此文件调入即可写片。在此,为使大家对整个过程有个认识,举一例说明:

ORG 0000H

LJMP START

ORG 040H

START:

MOV SP,#5FH ;设堆栈

LOOP:

NOP

LJMP LOOP ;循环

END ;结束

单片机指令表

一、传送操作

助记符 代码 说明

MOV A,Rn E8~EF 寄存器A

MOV A,direct E5 direct 直接字节送A

MOV A,@Ri ER~E7 间接RAM送A

MOV A,#data 74 data 立即数送A

MOV Rn,A F8~FF A送寄存器

MOV Rn,direct A8~AF direct 直接字节送寄存器

MOV Rn,#data 78~7F data 立即数送寄存器

MOV direct,A F5 direct A送直接字节

MOV direct,Rn 88~8F direct 寄存器送直接字节

MOV direct1,direct2 85 direct1 direct2 直接字节送直接字节

MOV direct,@Ro 86~87 间接RAM送直接字节

MOV direct,#data 75 direct data 立即数送直接字节

MOV @Ri,A F6~F7 A送间接RAM

MOV @Ri,direct 76~77 direct 直接字节送间接RAM

MOV @Ri,#data 76~77 data 立即数送间接RAM

MOV DPTR,#data16 90 data 15~8 16位常数送数据指针

data7~0

MOVC A,@A+DPTR 93 由((A)+(DPTR))寻址的程序存贮

器字节选A

MOVC A,@A+PC 83 由((A)+(PC));寻址的程序存贮器字节送A

MOVX A,@Ri E2~E3 送外部数据(8位地址)送A

MOVX A,@DPTR E0 送外部数据(16位地址)送A

MOVX @Ri,A F2~F3 A送外部数据(8位地址)

MOVX @DPTR,A F0 A送外部数据(16位地址)

PUSH direct C0 direct 直接字节进栈,SP加1

POP direct D0 direct 直接字节退栈,SP减1

XCH A,Rn C8~CF 交换A和寄存器

XCH A,direct C5 direct 交换A和直接字节

XCH A,@Ri C6~C7 交换A和间接RAM

XCH A,@Ri D6~D7 交换A和间接RAM的低位

SWAP A C4

二、算术操作

(A的二个半字节交换)

ADD A,Rn 28~2F 寄存器加到A

ADD A,direct 25 direct 直接字节加到A

ADD A,@Ri 26~27 间接RAM加到A

ADD A,#data 24data 立即数加到A

ADD A,Rn 38~3F 寄存器和进位位加到A

ADD A,direct 35direct 直接字节和进位位加到A

ADD A,@Ri 36~37 间接字节和进位位加到A

ADD A,data 34 data 立即数和进位位加到A

ADD A,Rn 98~9F A减去寄存器和进位位

ADD A,direct 95 direct A减去直接字节和进位位

ADD A,@Ri 36~37 间接RAM和进位位加到A

ADD A,data 34 data 立即数和进位位加到A

SUBB A,Rn 98~9F A减去寄存器和进位位

SUBB A,direct 95 direct A减去直接字节和进位位

SUBB A,@Ri 96~97 A减去间接RAM和进位位

SUBB A,#data 94 data A减去立即数和进位位

INC A 04 A加1

INC Rn 08~0F 寄存器加1

INC direct 05 direct 直接字节加1

INC @Ri 06~07 间接RAM加1

DEC A 14 A减1

DEC Rn 18~1F 寄存器减1

DEC direct 15 direct 直接字节减1

DEC @Ri 16~17 间接RAM减1

INC DPTR A3 数据指针加1

MUL AB A4 A乘以B

DIV AB 84 A除以B

DA A D4 A的十进制加法调整

三、逻辑操作

ANL A,Rn 58~5F 寄存器“与”到A

ANL A,direct 55 direct 直接字节“与”到A

ANL A,@Ri 56~57 间接RAm“与”到A

ANL A,#data 54 data 立即数“与”到A

ANL direct A 52 direct A“与”到直接字节

ANL direct,#data 53 direct data 立即数“与”到直接字节

ORL A,Rn 48~4F 寄存器“或”到A

ORL A,direct 45 direct 直接字节“或”到A

ORL A,@Ri 46~47 间接RAM“或”到A

ORL A,#data 44 data 立即数“或”到A

ORL direct,A 42 direct A“或”到直接字节

ORL direct,#data 43 direct data 立即数“或”到直接字节

XRL A,Rn 68~6F 寄存器“异或”到A

XRL A,direct 65 direct 直接字节“异或”到A

XRL A,@Ri 66~67 间接RAM“异或”到A

XRL A,#data 64 data 立即数“异或”到A

XRL direct A 62 direct A“异或”到直接字节

XRL direct,#data 63 direct data 立即数“异或”到直接字节

CLR A E4 清零

CPL A F4 A取反

RL A 23 A左环移

RLC A 33 A通过进位左环移

RR A 03 A右环移

RRC A 13 A通过进位右环移

四、控制程序转移

ACALL addr 11 *1 addr(a7~a0) 绝对子程序调用

LCALL addr 16 12 addr(15~8) 长子程序调用

addr(7~0)

RET 22 子程序调用返回

RETI addr 11 32 中断调用返回

AJMP addr 11 △1 addr(a7~a6) 绝对转移

LJMP addr 16 02addr(15~8) 长转移

addr(7~0)

SJMP rel 80 rel 短转移,相对转移

JMP @A+DPTR 73 相对于DPTR间接转移

JZ rel 60 rel A为零转移

JNZ rel 70 rel A为零转移

CJNE A,direct,rel B5 direct rel 直接字节与A比较,不等则转移

CJNE A,#data,rel B4 data rel 立即数与A比较,不等则转移

CJNE A,Rn,#data,rel B8~BF data rel 立即数与寄存器比较,不等则转移

CJNE @Ri,#data,rel B6~B7 data rel 立即数与间接RAM比较,不等则转移

DJNZ Rn,rel D8~DF rel 寄存器减1,不为零则转移

DJNZ direct,rel B5 direct rel 直接字节减1,不为零则转移

NOP 00 空操作

五、布尔变量操作

CLR C C3 清零进位

CLR bit C2 清零直接位

SETB C D3 置位进位

SETB bit D2 置位直接位

CPL C B3 进位取反

CPL bit B2 直接位取反

ANL C,bit 82 dit 直接数“与”到进位

ANL C,/bit B0 直接位的反“与”到进位

ORL C,bit 72 bit 直接位“或”到进位

ORL C,/bit A0 bit 直接位的反“或”到进位

MOV C,bit A2 bit 直接位送进位

MOV bit,C 92 bit 进位送直接位

JC rel 40 rel 进位位为1转移

JNC rel 50 rel 进位位为0转移

JB bit,rel 20 bit rel 直接位为1相对转移

JNB bit,rel 30 bit rel 直接位为0相对转移

JBC bit,rel 10 bit rel 直接位为1相对转移,然后清零该位

攻击技术

目前,攻击单片机主要有四种技术,分别是:

(1)软件攻击

该技术通常使用处理器通信接口并利用协议、加密算法或这些算法中的安全漏洞来进行攻击。软件攻击取得成功的一个典型事例是对早期ATMEL AT89C 系列单片机的攻击。攻击者利用了该系列单片机擦除操作时序设计上的漏洞,使用自编程序在擦除加密锁定位后,停止下一步擦除片内程序存储器数据的操作,从而使加过密的单片机变成没加密的单片机,然后利用编程器读出片内程序。

(2) 电子探测攻击

该技术通常以高时间分辨率来监控处理器在正常操作时所有电源和接口连接的模拟特性,并通过监控它的电磁辐射特性来实施攻击。因为单片机是一个活动的电子器件,当它执行不同的指令时,对应的电源功率消耗也相应变化。这样通过使用特殊的电子测量仪器和数学统计方法分析和检测这些变化,即可获取单片机中的特定关键信息。

(3)过错产生技术

该技术使用异常工作条件来使处理器出错,然后提供额外的访问来进行攻击。使用最广泛的过错产生攻击手段包括电压冲击和时钟冲击。低电压和高电压攻击可用来禁止保护电路工作或强制处理器执行错误操作。时钟瞬态跳变也许会复位保护电路而不会破坏受保护信息。电源和时钟瞬态跳变可以在某些处理器中影响单条指令的解码和执行。

(4)探针技术

该技术是直接暴露芯片内部连线,然后观察、操控、干扰单片机以达到攻击目的。为了方便起见,人们将以上四种攻击技术分成两类,一类是侵入型攻击(物理攻击),这类攻击需要破坏封装,然后借助半导体测试设备、显微镜和微定位器,在专门的实验室花上几小时甚至几周时间才能完成。所有的微探针技术都属于侵入型攻击。另外三种方法属于非侵入型攻击,被攻击的单片机不会被物理损坏。在某些场合非侵入型攻击是特别危险的,但是因为非侵入型攻击所需设备通常可以自制和升级,因此非常廉价。

大部分非侵入型攻击需要攻击者具备良好的处理器知识和软件知识。与之相反,侵入型的探针攻击则不需要太多的初始知识,而且通常可用一整套相似的技术对付宽范围的产品。

加密方法

科研成果保护是每一个科研人员最关心的事情,加密方法有软件加密,硬件加密,软硬件综合加密,时间加密,错误引导加密,专利保护等措施有矛就有盾,有盾就有矛,有矛有盾,才促进矛盾质量水平的提高加密只讲盾,也希望网友提供更新的加密思路,现先讲一个软件加密:利用MCS-51 中A5 指令加密,其实世界上所有资料,包括英文资料都没有讲这条指令,其实这是很好的加密指令A5 功能是二字节空操作指令加密方法在A5 后加一个二字节或三字节操作码,因为所有反汇编软件都不会反汇编A5 指令,造成正常程序反汇编乱套,执行程序无问题仿制者就不能改变你的源程序。

硬件加密:8031/8052 单片机就是8031/8052掩模产品中的不合格产品,内部有ROM,可以把8031/8052 当8751/8752 来用,再扩展外部程序器,然后调用8031 内部子程序当然你所选的同批8031 芯片的首地址及所需用的中断入口均应转到外部程序区。

硬件加密

用高电压或激光烧断某条引脚,使其读不到内部程序,用高电压会造成一些器件损坏重要RAM 数据采用电池(大电容,街机采用的办法)保护,拔出芯片数据失去机器不能起动,或能初始化,但不能运行。

用真假方法加密

擦除芯片标识

把8X52 单片机,标成8X51 单片机,并用到后128B的RAM 等方法,把AT90S8252 当AT89C52,初始化后程序段中并用到EEPROM 内容,你再去联想吧!

用激光(或丝印)打上其它标识如有的单片机引脚兼容,有的又不是同一种单片机,可张冠李戴,只能意会了,这要求你知识面广一点 。

用最新出厂编号的单片机,如2000 年后的AT89C 就难解密,或新的单片机品种,如AVR 单片机。

DIP 封装改成PLCC,TQFP,SOIC,BGA等封装,如果量大可以做定制ASIC,或软封装,用不需外晶振的单片机工作(如AVR 单片机中的AT90S1200),使用更复杂的单片机,FPGA+AVR+SRAM=AT40K系列。

硬件加密与软件加密只是为叙说方便而分开来讲,其实它们是分不开的,互相支撑,互相依存的软件加密:其目的是不让人读懂你的程序,不能修改程序,你可以………….....

利用单片机未公开,未被利用的标志位或单元,作为软件标志位,如8031/8051 有一个用户标志位,PSW.1 位,是可以利用的程序入口地址不要用整地址,如:XX00H,XXX0H,可用整地址-1,或-2,而在整地址处加二字节或三字节操作码,在无程序的空单元也加上程序机器码,最好要加巧妙一点用大容量芯片,用市场上仿真器不能仿真的芯片,如内部程序为64KB 或大于64KB 的器件,如:AVR 单片机中ATmega103 的Flash 程序存储器为128KBAT89S8252/AT89S53 中有EEPROM,关键数据存放在EEPROM 中,或程序初始化时把密码写到EEPROM 中,程序执行时再查密码正确与否,尽量不让人家读懂程序。关于单片机加密,讲到这里,就算抛砖引玉。    

*文章为作者独立观点,不代表造价通立场,除来源是“造价通”外。
关注微信公众号造价通(zjtcn_Largedata),获取建设行业第一手资讯

热门推荐

相关阅读