硬着头皮学51指令:鼓捣mcu的必修课
前面交待了51的数据存储系统,作为一个单片机之所以能玩出那么多花样,关键就是把一些数据在内存中炒来炒去,最后出锅装盘反映到单片机的输出。为了进行数据的传递,加工,转移等等从而构成单片机的思想--软件,必须有和单片机的硬件配套的指令。指令也好数据也好,其实都是二进数,单片机的硬件会根据运行节奏判断哪些是数据,哪些是要进行的操作。而为了方便使用,易于理解,人们用”助记符“来表示指令例如,用
MOV A,30H
表示把RAM地址为30H的那个存储单元里面的数据送到(其实说复制到更正确,因为执行指令后30单元中的数据还在)累加器A中去,这样比直接用16进数“E530”易于了解多了,又比直接语言表述简单多了。通过编程工具自动把它转化为机器代码,又方便又不易出错。
这个,就是一条指令,通常指令必须有“操作码”:就是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 编辑 ] 接着是算术运算和逻辑运算指令入如下
其中逻辑运算是两个二进操作数按位进行
特别是0FFH和任何数相与,结果等于任何数。
0FFH和任何数相或,结果等于0FFH。
0和任何数相或,结果等于任何数。
0和任何数相与,结果等于0。 最后是非常重要的转移指令以及C51的特色:位操作指令。
为了让1程序在运行中根据条件而选择转向,就必须使用各种转移指令,这也是构成单片机“智能”的关键。特别是DJNZ在处理有限次数循环(得到延时),以及JMP @A+DPTR,可以随着A的内容不同转移到不同的程序地址(散转)编程中常常用到。
从最开始51就具有位逻辑运算的能力,直接处理位如同使用微型可编程控制器,给单片机增加了很多灵活性。举例来说,为了在楼梯两端都能控制1个灯泡,就要用“双连开关”,并增加配线,可是用老办法实现更多点对一个灯的任意开关就非常困难,而这个用51处理,简直太简单了。闲话少说,还是把最后的基本指令贴出来如下:
注意在实际用汇编语言编程时,我们会在某一句指令(操作码 操作数,操作数...)前面加上“标号“,用标号来指示程序的位置也就是ROM中的地址,至于这些地址具体是多少,我们不去管它,由汇编器去自动处理,写转移指令、子程序调用等等岂不是方便多多?所以实际上我们在编程时往往采取如下形式进行:(当然没有必要每一条指令都加上标号)
..........
LOOP: INC A ;A自增1
MOVR0 , A ,A的数据送R0
CJNER0 ,#80H , LOOP ;R0的数据不等于立即数80H,则转LOOP地址进行A自增循环,否则往下走
NOP
ACALLSUBB1 ;调用子程序SUBB1,用标号作为子程序名字
NEXT: XX...
..........
SUBB1: YY...
RET ;子程序完成后返回主程序继续,也就是NEXT位置
...........
当然,程序中还要安排使得子程序只有用LCALL或ACALL才能调用,而不能通过顺序地址直达。另外在编程时直接使用LJMP或LCALL好了,并不多占用执行时间,而且什么场合都不会出错。
[ 本帖最后由 wey05 于 2007-7-30 15:12 编辑 ] 谢谢! 收藏了, 待以后慢慢学.
能否请楼主举几个简单的例子谈谈实际程序的写作. 期待中.... 是的,下一步不单单举例,让我们一起通过编程集成环境和软件仿真,实际体会一下汇编语言编程初步和运行效果。。。,另外开贴,谢谢! 用C比较省事, 我强烈推荐大家学C 这个要学习一下哟。打酒的路过 这个要学习一下哟。打酒的路过 楼主辛苦了!我是新手,努力学习中 楼主辛苦了!我是新手,努力学习中 向你学习,取长补短 现在看来不像刚接触时那么难懂了 我也觉得还是C吧 呵呵,支持啊~学习了~
页:
[1]