|
前面交待了51的数据存储系统,作为一个单片机之所以能玩出那么多花样,关键就是把一些数据在内存中炒来炒去,最后出锅装盘反映到单片机的输出。为了进行数据的传递,加工,转移等等从而构成单片机的思想--软件,必须有和单片机的硬件配套的指令。指令也好数据也好,其实都是二进数,单片机的硬件会根据运行节奏判断哪些是数据,哪些是要进行的操作。而为了方便使用,易于理解,人们用”助记符“来表示指令
例如,用
MOV A,30H
表示把RAM地址为30H的那个存储单元里面的数据送到(其实说复制到更正确,因为执行指令后30单元中的数据还在)累加器A中去,这样比直接用16进数“E5 30”易于了解多了,又比直接语言表述简单多了。通过编程工具自动把它转化为机器代码,又方便又不易出错。
这个,就是一条指令,通常指令必须有“操作码”:就是MOV,而接着的操作数就是30H。
有的指令可以不要操作数,例如
INC A
是把A中的数据+1,就不要操作数。指令只有1个字节长:单字节指令。(复位后,A中为0,如果程序开始就来一条这个指令,则A中的数据就成了1)
有的指令有一个操作数,如前面的,有的指令可能有2个操作数,例如
MOV 30 ,#20H
是把一个16进数20H送到存储单元30中去,“#”表示后面的不是存储单元地址,而是实实在在和指令一起的数值(实际在ROM中。)
这样就有两个操作数:30H和20H,这条指令的16进机器代码是“75H 30H 20H”可见虽然和前面指令助记符表示差不多,机器码却完全不同,只要单片机复位后第一条指令正确,后面就不会犯错,单片机按工作节奏就可以识别出来操作马和操作数,不会把操作数误以为操作码,或者相反。
51的基本指令有111条,可以分成5类:
1。数据传送指令
2。算术操作指令
3。逻辑操作指令
4。程序转移指令
5。位操作指令
看着不少其实有些指令现在可以暂时不管(例如片外RAM的存取),实际编程也不是每条指令都要用到,逐步学习逐步深入。
下面先给出29条数据传送指令的汇总表
其中采用了一些符号表示操作功能:
用Ri表示工作寄存器名称,加括号(Ri)表示Ri中的数据,(A)->Ri表示把A中的数据送Ri,(Ri)->A,是把Ri中的数据送A; direct表示单元直接地址例如30H,(direct)表示直接地址单元中的数据,#nn表示8位立即数,#nnnn表示16位立即数。
[ 本帖最后由 wey05 于 2007-7-28 17:49 编辑 ] |
|