当前位置: 首页>编程语言>正文

汇编语法及demo 汇编语言djnz

从图中我们可以看出,在51单片机内部有一个 CPU 用来运算、控制,有四个并行 I/O 口 ,分别是P0、P1、P2、P3,有ROM ,用来存放程序,有RAM ,用来存放中间结果,此外还有定时 / 计数器 串行 I/O 口 中断系统 ,以及一个内部的时钟电路 。在一个51单片机的内部包含了这么多的东西。

例如:

D1: MOV R6,#250       ;
         D2: DJNZ R6,D2     ;

MOV :

在 250 前面有个 # 号,这又是什么意思呢?这个 # 就是用来说明 250 就是一个被传递的东西本身,而不是传递者。

DJNZ (D ec 1 J mp if N ot Z ero):

第一个参数中的值减 1 ,然后看一下,这个值是否等于 0 ,如果等于 0 ,就往下执行,如果不等于 0 ,就转移,转到什么地方去呢?可能大家已猜到了,转到第二个参数所指定的地方去(请 大家用自已的话讲一下这条语句是怎样执行的)。本条指令的最终执行结果就是,在原地转圈 250次。

对上面的图进行进一步的分析,我们已知,对并行I/O口的读写只要将数据送入到相应I/O口的锁存器就可以了,那么对于 定时/计数 器,串行I/O口等怎么用呢?在单片机中有一些独立的存储单元是用来控制这些器件的,被称之为特殊功能寄存器( SFR 。事实上,我们已接触过P1这个特殊功能寄存器了,还有哪些 呢?看表1

符号

地址

功能介绍

B

F0H

B 寄存器

ACC

E0H

累加器

PSW

D0H

程序状态字

IP

B8H

中断优先级控制寄存器

P3

B0H

P3 口锁存器

IE

A8H

中断允许控制寄存器

P2

A0H

P2 口锁存器

SBUF

99H

串行口锁存器

SCON

98H

串行口控制寄存器

P1

90H

P1 口锁存器

TH1

8DH

定时器 / 计数器 1 (高 8 位)

TH0

8CH

定时器 / 计数器 1 (低 8 位)

TL1

8BH

定时器 / 计数器 0 (高 8 位)

TL0

8AH

定时器 / 计数器 0 (低 8 位)

TMOD

89A

定时器 / 计数器方式控制寄存器

TCON

88H

定时器 / 计数器控制寄存器

DPH

83H

数据地址指针(高 8 位)

DPL

82H

数据地址指针(低 8 位)

SP

81H

堆栈指针

P0

80H

P0 口锁存器

PCON

87H

电源控制寄存器

表1

SFR ( Special Function Register)是特殊功能寄存器的总称,是单片计算机中的一组特殊的临时存储区域,用于动态存放计算机运行过程的一些状态信息、并依此做相应的控制。MCS-51单片机就设有18个专用寄存器,P0-P3端口,定时/计数器T0、T1,TMOD、TCON、PCON、SCON 、PSW、IE、A、B、IP等等。SFR越多,编和控制功能越强、越灵活,但需要硬资源,所以系统设计时会根据需要来确定,

  1. ACC:累加器,通常用A表示。这是个什么东西,可不能从名 字上理解,它是一个寄存器,而不是一个做加法的东西,为什么给它这么一个名字呢?或许是因为在运算器做运算时其中一个数一定是在ACC中的缘故吧。它的名字特殊,身 份也特殊,稍后我们将学到指令,可以发现,所有的运算类指令都离不开它。

     2、B:一个寄存器。在做乘、除法时放乘 数或除数,不做乘除法时,随你怎么用。

     3、PSW:程序状态字。这是一个很重要的东西,里面放了CPU工作时的很多状态,借此,我们可以了解CPU的当前状态,并作出相应 的处理。它的各位功能请看表2

D7

D6

D5

D4

D3

D2

D1

D0

CY

AC

F0

RS1

RS0

OV

表2

下面我们逐一介绍各位的用途

( 1 ) CY :进位标志。 8051 中的运算器是一种 8 位的运算器,我们知道, 8 位运算器只能表示到 0-255 ,如果做加法的话,两数相加可能会超过 255 ,这样最高位就会丢失,造成运算的错误,怎么办?最高位就进到这里来。这样就没事 了。

例: 78H+97H ( 01111000+10010111 )

  1. :半进位标志。
    例: 57H+3AH ( 01010111+00111010 )
    :用户标志位,由我们 (编程人员)决定什么时候用,什么时候不用。
    (4)RS1 、 RS0 :工作寄存器组选择位。这个我 们已知了。
    (5)0V :溢出标志位。什么是溢出 我们稍后再谈吧。
    (6)P :奇偶校验位:它用来表示 ALU 运算结果中二进制数位“ 1 ”的个数的奇偶性。若为奇数,则 P=1 ,否则为

例:某运算结果是 78H ( 01111000 ),显然 1 的个数为偶数,所以

4.DPTR:51单片机中的可十六位寻址的数据指针寄存器,由两个8Bit的寄存器(DPH和DPL)组成。使用mov指令可以一次写入它的高字节和低字节,如: mov dptr,#add16

、 P0 、P1、P2、 P3 :这个我们已经知道,是四个并行 输入 / 输出 口的寄存器。它里面的内容对应着管脚的输出。

:堆栈指针。

       堆栈介绍:日常生活中,我们都注意到过这样的现象,家里洗的碗,一只一只摞起来,最晚放上去的放在最上面,而最早放上去 的则放在最下面,在取的时候正好相 反,先从最上面取,这种现象我们用一句话来概括:“先进后出,后进先出”。请大家想想,还有什么地方有这种现象?其实比比皆是,建筑工地上堆放的砖头、材 料,仓库里放的货物,都是“先进后出,后进先出”,这实际是一种存取物品的规则,我们称之为“堆栈”。

在单片机中,我们也可以在 RAM 中构造这样一个区域,用来存放数 据,这个区域存放数据的规则就是“先进后出,后进先出”,我们称之为“堆栈”。为什么需要这样来存放数据呢?存储器本身不是可以按地址来存放数据吗?对, 知道了地址的确就可以知道里面的内容,但如果我们需要存放的是一批数据,每一个数据都需要知道地址那不是麻烦吗?如果我们让数据一个接一个地放置,那么我 们只要知道第一个数据所在地址单元就可以了(看图 2 )如果第一个数据在 27H ,那么第二、三个就在 28H 、 29H 了。所以利用堆栈这种方法来放数据可以简化操作

那么 51 中堆栈什么地方呢?单片机中能存放数据的区域有限,我们不能够专门分配一块地方做堆 栈,所以就在内存( RAM )中开辟一块地方,用于堆栈,但是用内存的哪一块呢?还是不好定,因为 51 是一种通用的单片机,各人的实际需求各不相同,有人需要多一些堆栈,而有人则不需要 那么多,所以怎么分配都不合适,怎样来解决这个问题 ?分不好干脆就不分了,把分的权利给用户(编程者),根据自已的需要去定吧,所以 51 单片机中堆栈的位置是可以变化的。 而这种变化就体现在 SP 中值的变化,看图 2 , SP 中的值等于 27H 不就相当于是一个指针指向 27H 单元吗?当然在真正的 51 机中,开始指针所指的位置并非就是数据存放的位置,而是数据存放的前一个位置,比如 一开始指针是指向 27H 单元的,那么第一个数据的位置是 28H 单元,而不是 27H 单元,为什么会这样,我们在学堆栈命令时再说明。


https://www.xamrdz.com/lan/5qz1961769.html

相关文章: