51汇编指令

ORG是Origin的缩写:起始地址,源。在汇编语言源程序的开始通常都用一条。
ORG伪指令来实现规定程序的起始地址。如果不用ORG规定则汇编得到的目标程序将从0000H开始。
  例如:
  ORG 2000H  
(1) 分号“;” 分隔符 这条指令到此为止 相当于C的注释符,后面可以添加注释
(2) 程序中的标点符号,必须是在英文状态下输入,半角
(3) 标号(标号可指定除系统占用外的标号)
      MAIN :  待执行程序;
                   LJMP MAIN; 执行完过后跳转回标号处
(4) 程序调用: LCALL
      LCALL DELAY;调用DELAY标号下的程序
(5) 返回指令:  RET 
      执行程序时遇到RET指令,返回,然后执行之后的指令,如同C语言的return 
(6)子程序
     延时程序
     DELAY: 程序代码;
                    RET; 返回
                    END;结束子程序
(7)减一跳转指令:DJNZ (Decrese one if not zero jump to REL)
     格式: DJNZ Rn,rel; 双字节指令  Rn  <=255    或者 -127<Rn<128
                  DJNZ direct,rel;单字节指令
     说明:DJNZ RN,REL 是一条件转移指令,先将工作寄存器Rn中的数减“1”,判断结果是否为“0”,不为“0”程序就跳转到行标为REL的地方执行,否则,为“0”就不转移,继续执行下一条指令。
    例子:延时程序   延时 250*250 = 62500 个指令周期
   DELAY: MOV R7,#250  ;  工作寄存器 R7 =250      
          D1:MOV R6,#250;   工作寄存器 R6 =250      
          D2:DJNZ  R6,D2  ;   while(R6)   R6--
                DJNZ R7,D1     ;   IF(R7-- >0)  LJMP:D1
                RET                      ;    结束程序
                END                      ;    结束标志
(8)机器周期:计算机每访问一次存储器的时间 一个机器周期=12个震荡周期
     震荡周期:震荡源的周期,即晶振等时间源周期,若使用12M晶振那么其 震荡周期= 1/(12,000,000) 即1/12微秒 那么一个机器周期即1微秒
    指令周期: 执行一次指令所需要的机器周期,不同的指令需要的机器周期
是不一样的,我们一般需要知道与时间有关的指令的周期,如DJNZ为双周 期指令,即如果用12M晶振,执行一次DJNZ需要的时间为2微秒。
(9)外部时钟电路:当系统使用多片单片机时,为了保证每片单片机的时钟频 率是一样的,各个单片机需要在外部接入同一个时钟信号源。
(10)单片机的存储器ROM和RAM
      ROM:READ ONLY MEMROY 只读存储器,用来存储单片机的控制程序 和不可更改数据。
      RAM:READ ACCESS MEMROY随机读写存储器,一般用作单片机的功能 寄存器和工作寄存器
(11)直接寻址:MOV R6,#22;  直接使用数所在的地址传送,R6是定义的一 个绝对地址。
    寄存器寻址:MOV 30H,#22;
                          MOV  R6,30H;  先把数存储在一个中间变量,然后再传送
         
          以累加器为目的操作数的指令
         (1)MOV A,Rn    将寄存器Rn中的值传入A
         (2)MOV Rn,A    将累加器中的值传入寄存器Rn
         (3)MOV A,direct 将直接地址中的值传入累加器A
         (4)MOV A,@Ri   将寄存器中的值作为地址把该地址中的内容传入A
         (5)MOV A,#DATA 将立即数传入A
     
(12)单片机与外部RAM之间的数据交换,在51系列单片机中所有要送入或读 出外部RAM的数据必须先送到A中去,内部RAM可以直接传送数据,外部 RAM不行。
       指令
     (1)MOVX   A,@Ri      ;将外部RAM地址存储于Ri 或者DPTR然后将地址   
                                            指向的内容传入A
     (2)MOVX @Ri,A            
     (3)MOVX A,@DPTR           
     (4)MOVX  @DPTR,A
(13)单片机伪指令
       伪指令是用来给寄存器定义或者赋值的指令
      ORG :程序开始地址伪指令,本条指令的下一条指令从指定的地址开始存 放数据。
     DB:定义字节伪指令
            从程序存储器某位置开始存储一组规定好的8位2进制数
     DW:定义字伪指令
            从程序存储器某位置开始存储一组规定好的16位2进制数
      DS:保留空间伪指令
      ORG 2000H;
      TAB:  DB  45,48H,10,34H;
      以上程序意义为 从存储器地址2000H处依次存进45,48H,10,34H;
       ORG 2000H;
       ABC:DS0  8H;
       LOOP:MOV A,30H;
       LOOP 标号的指令存储在2008H后
       注意:DB,DW,DS只能针对ROM存储器,不能操作RAM
(14)堆栈的操作指令
        (1)PUSH  direct    将direct中的内容推入堆栈  
        (2)POP     direct    将对堆栈中的内容取出存至direct
           堆栈操作指令 流程
            先确定 堆栈开始地址        MOV SP,#5FH;
                                                      MOV   A,#100;   
                                                      MOV  B, #20;
                                                      PUSH  ACC;堆栈地址+1
                                                      PUSH B;     在#60H处存入 20
                                                      POP   B;      将#60H处的20取出
                                                      POP    ACC;堆栈地址-1  当前堆栈地址为#5FH
(15)加法运算指令
       ADD(8位加法),ADDC(带进位加法,进位存在PSW的CY位中)
       SUBB (带借位的减法指令,没有不带借位的减法指令) 
      ADD  A,Rn;
      ADD  A,@Ri;
      ADD  A,direct;
      ADD  A,#data;
      ADDC是进行低8位加法,若有进位则存在CY中,再做高位加法将结果加
上进位,得到最终答案。   
(16)乘法指令
       MUL  
      用法 MUL A B;  其功能为将A与B值相乘,其中得到值得高八位存在B中,
低八位存在A中,若超出16位值,则PSW的OV位溢出,否则OV位为0,CY
位则是总是为0;
     注意 A B均为无符号数
(17)除法指令
      DIV 
      用法:DIV  AB  (A/B)
      8位无符号数A 除以8位无符号数B,得到的商存至 A 中,余数存至 B中,
若DIV AB ; B= 00H 即除数为0 ,则OV为1 溢出。
(18)加1指令 INC   单周期指令
             减1指令 DEC
            用法: INC A;
                         INC Rn;   INC direct; INC @Ri;
注意,在算数运算类指令中,除了INC DEC其他指令都要将结果放在累加器 A 中。
(19)对累加器的逻辑运算指令
             (1累加器清零                      CLR A;
               (2)逻辑“非”,逐位取反           CPL A;
               (3)逻辑左移,逐位左移              RL   A;
               (4)加上CY逻辑左移,相当于带移动的数为9位数  RLC A;
               (5)逻辑右移                                RR A;
               (6)加上CY逻辑右移                   RRC A;
               (7)高低4为交换                          SWAP A;
(20)两个寄存器间的逻辑运算  所得结果放在前一个值
              (1)逻辑与  ANL      ANL A,Rn;  结果放在A中
              (2)逻辑或  ORL     ORL A,Rn;
              (3)逻辑异或 XRL     XRL A,Rn;  

流水灯实验:
ORG  0000H        ; 程序开始地址(复位地址)
LJMP  START        ; 程序跳到start标号处
ORG  30H           ; 程序指令存储开始地址 30H
START:MOV  SP,#5FH ; 堆栈初始化指令
MOV  A,#80H        ;   A  1000000
LOOP:MOV  P1,A     ; 将P1寄存器的值改为A中的值
RL  A              ; 左移
LCALL  DELAY       ;延时 
LJMP  LOOP         ; 循环
DELAY:MOV  R7,#255 ; 延时程序
   D1:MOV  R6,#255 ; 
   D2:NOP 
      NOP 
      NOP 
      NOP 
DJNZ  R6,D2        ; 
DJNZ  R7,D1        ; 
RET                ; 
END  ;
延时时间 = 255*255*4个指令周期
(21)条件转移指令
       (A)无条件转移指令
 (1)无条件绝对转移指令 AJMP   addr11
 (2)无条件长转移指令     LJMP    addr16
 (3)无条件相对转移指令 SJMP    rel
              addr11 跳转地址范围 限制为11位字节即2k页面内
              addr16 跳转地址范围 限制为16位字节即64k(51最大外部rom) 页面内
              rel        跳转地址范围为8位地址内
                  原则上AJMP,SJMP都可以用LJMP 替代
 (4)无条件间接转移指令 JMP  @A+DPTR
                       将跳转表格的首地址存入DPTR中,然后通过向A输入值来确定
要跳转至表格的位置,实现按键功能等。。
           (B)条件转移类指令
 (1)累加器为0转移指令:JZ  rel;           MOV A,R0;JZ L1;
   ( 2) 累加器为非0转移指令:JNZ rel;      
          (C)比较转移指令
 (1)CJNE  A,#data,rel    比较如果A!=#data则跳转至rel地址;相等, 则顺序执行,同时如果A>data则CY=0否则CY=1;
         (D)循环转移指令
 DJNZ       Rn,rel;           减1不为0则跳转,否则继续执行
(22)调用和返回指令
 (1)长调用  LCALL addr16
 (2)短调用 ACALL addr11
 (3)返回 
          子程序返回 RET
          中断返回 RETI
 (4)空操作指令  NOP 停一个机器周期
(23)位操作指令
     (1)位数据传输
  A.MOV C,bit ------>  MOV C,P1.0;
  B.MOV bit,C-------> MOV P1.0,C;
 (2)位清零指令
  A,CLR C ------->使CY位=0
  B,CLR bit------->CLR P1.0;
 (3)位置1指令
  A,SETB   C----->使CY=1;
  B,SETB bit------>SETB P1.0;
 (4)位取反指令
  A,CPL C -------->CY取反
  B,CPL bit------->CPL P1.0;
 (5)位逻辑与指令
  A.ANL C,bit
  B.ANL C,/bit    将bit位取出后 取反 再与C逻辑与,其结果存 在CY中,bit中的值不变
 (6)位逻辑或指令
  A.ORL C,bit
  B.ORL bit,C
 (7)判CY条件转移指令
  A.JC     rel         CY=1 转移至rel 否则顺序执行
  B.JNC   rel        CY!=1 转移至rel 否则顺序执行
 (8)判位变量转移指令
  A.JB bit,rel---->JB P1.0,LOOP; 若P1.0=1则loop
  B.JNB bit,rel
  C.JBC bit,rel----->JB P1.0,LOOP;若P1.0=1则转移至loop 同时将P1.0清零。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值