5 MCS-51指令系统

学习笔记
作者: MingXiao

5.1 指令概述

在系统定时时,最小间隔就是机器周期,12MHz的最小间隔就是1us

通用寄存器

8bit寄存器间接寻址时,只能使用R0, R1,即

MOV A, @R0		;@R1

R0, R1统称为RiR0-R7统称为Rn

16bit直接用DPTR

5.2 寻址方式

  • 立即寻址

    MOV A, #10H    ;10H为idata
    

    优点是很快,缺点是占用ROM空间,因为立即数在机器码中占1B

  • 直接寻址

    MOV A, 10H    ;10H为地址单元
    
  • 寄存器寻址

    MOV A, R0    
    

    虽然R0地址为00H,但这条指令是单字节、单周期,而直接寻址是双字节、双周期

  • 寄存器间接寻址

    MOV A, @R0
    MOV B, @DPTR
    

    使用R0, R1时,表示8bit寻址;使用DPTR时,表示16bit寻址

  • 基址变址寻址

    MOVC A, @A+DPTR
    MOVC A, @A+PC        ;执行时先要PC+=1,然后才赋值
    

    MOVC是程序存储器,但不一定外部;只有DPTR, PC能够基址变址寻址(作为基址使用)

  • 相对寻址

    JC LABEL    
    

    短距离跳转用

  • 位寻址

    SETB 3DH        ;将27H.5位置为1
    CLR C            ;将CY置为0
    

    按位寻址来

5.3 数据传输类指令

例:将外部RAM的100H地址处的数据存放在200H处

MOV	DPTR, #0100H
MOVX A, @DPTR
MOV DPTR, #0200H
MOVX @DPTR, A

查表

MOV DPTR, #0100H		;CODE Seg内的数据头位置
MOV A, R0
MOVC A, @A+DPTR

ORG 0100H
DB 0, 1, 4, 9

交换指令

XCH A, Rn			;交换A,Rn
XCH	A, idata		;交换A,(idata)
XCHD A, @Ri			;交换低位, A.3-A.0 与 (Ri).3-(Ri).0
SWAP A				;交换A的高低位, A.3-A.0 与 A.7-A.4

5.4 算术运算指令

A操作,均对PSW有影响

ADD A, #data		;不带进位
ADDC A, #data		;带进位,+CY
INC A				;A += 1

MOV A, #00010101 BCD	;BCD表示
ADD A, #8			;A = 1DH,按二进制加
DA A				;修正BCD指令,A = 23H

CLR C				;清空CY
SUBB A, #data		;带借位,A = A - #data -CY,故第一次减法前要 CLR C
DEC A				;A -= 1

;乘除只能用AB
MUL AB				;BA = A*B,高8bit在B,低8bit在A
DIV AB				;A/B,商在A,余数在B

5.5 逻辑运算类指令

目的操作数为A时,影响PWS

ORL A, #data		;按位或
ORL A, address		;若为I/O口,则读引脚
ORL address, A		;(address)按位或A
ORL address, #data	;后两条指令若地址为I/O口,则为读锁存器-改写指令

ANL A, #data		;按位和

XRL A, #data		;按位异或

CPL A				;按位取反,A = A_bar

CLR	A				;清零

RL A				;Rotate Left,A循环左移1bit
RR A				;循环右移1bit
RLC A				;CY-A.7-A.0循环左移,CY是MSB
RRC					;CY是MSB,循环右移

5.6 控制转移类指令

改变的是PC,对PSW无影响

AJMP addr11			;短转移,2KB,即两个地址高5bit一致,且在同一个页内
					;也就是不是在转移开始的2k,而是定死的
LJMP addr16			;长转移,64KB
SJMP rel			;相对转移,-128~127,用的是偏移地址
JMP	@A+DPTR			;间接转移,-128~127,常用的散转分支转移语句

JZ rel				;A=0转移,偏移地址,可以是label,下同
JNZ rel				;A!=0转移
CJNE A, #data, rel	;比较A与#data,不等就跳转,偏移地址;同时会A-#data,仅改变CY
					;A的位置也能写Rn和@Ri

DJNZ Rn, rel		;先将Rn-1,若Rn!=0则跳转,Rn的位置可以写地址

JC rel				;JMP Carry,CY=1就JMP
JNC rel				;JMP Not Carry

JB bit, rel			;位地址(bit)=1,JMP
JNB bit, rel		;(bit)=0
JBC	bit, rel		;若(bit)=1,则将其置为0,并JMP

LCALL addre16		;长调用指令,16bit,64KB,指令3B,可以用label代替addre,PC+3压栈
ACALL addre11		;短调用指令,11bit,2KB,指令2B,可以用label,PC+2压栈

RET					;子程序返回指令,栈顶的PC返回给PC,弹栈两次
RETI				;中断例程返回,栈顶PC返回,弹栈,对中断优先级状态触发器的清零

5.7 位操作指令

涉及到能按位寻址的寄存器等

MOV C, P1.0			;将P1口的第0bit赋给CY寄存器
CLR C
SETB C				;令CY=1
ANL C, /P1.0		;将P1.0取反后与C做and,赋给C,P1.0本身不会改变


Comments