第三章:MCS-51单片机汇编程序设计 教学目的和要求 本章主要介绍MCS-51单片机的寻址方式、指令系统和汇编语言 程序设计。要求掌握MCS-51的7种寻址方式,掌握5类指令,了解 伪指令,进一步理解单片机的内部结构,为进一步学习C51程序设计 打好基础。 重点:寻址方式、指令系统、伪指令 难点:指令系统 学时:3 指令:能完成特定功能的命令。 指令系统:CPU所能执行的各种指令的集合。 汇编语言程序设计:利用汇编语言设计程序。 3.1、MCS-51指令系统的概述 一、指令格式 指令格式:即指令的结构形式一操作码操十操作数或操作数地 址 例:MOVA,0FFH 由操作码和操作数(或操作数地址)构成指令的结构 二、指令的三种表示形式: 1、二进制的表示形式: 例:00100100B是加法ADD的二进制形式 特点:能被CPU直接识别、运行的形式。也称机器码、汇编语 言的目标代码
缺点:不便于阅读、记忆和调试修改。 2、十六进制表示方式—它是对二进制形式的一种简化。 ADD00100100B 24H 二进制表示的形式十六进制表示的形式 在实验室等少数环境下,可以将这种形式作为输入程序的一种辅 助手段。但是,这种形式的指令格式必须由对应的监控程序把它们翻 译成二进制的“机器码”后存入程序存储器并运行。 指令的“助记符”方式(也称“汇编格式”): 00100100B24HADD (1)是一种由英文单词或字母、数字来表征指令功能的形 式。是一种便于阅读、书写和交流的表示形式。 (2)这种“汇编”格式的指令必须把它“翻译”为二进制形式 “机器码”后才能为CPU所识别和执行。 (3)三种不同的表示方法适用于不同的场合。 三、指令的字节数 在MCS-51单片机的指令系统中,因指令操作码和操作数的不 同,指令(在存储器中)长度也各不相同。分为单字节、双字节和三 字节。(共计111条) 单字节指令(49条):指令的操作码和操作数在存储器中总共 占一字节(bit)。 双字节指令(46条):指令的操作码和操作数在存储器中各占 个字节。 三字节指令(16条):指令中的操作数为双字节
说明:指令的字节数与指令周期不是对等的关系 MUL AB1(字节) 4(周期) 乘法指令 MOVA,0FFH2(字节)1(周期)立即数FFH送A 四、指令的书写格式(P31) 标号:操作码操作数或操作数地址1,操作数或操作数地址2: 注释 例:LOOP:MOVA,#40H;取参数 1、标号:是根据编程需要给指令设定的符号地址,可有可无: 标号由18个字符组成,第一个字符必须是英文字,不能是数字或其 它符号:标号后必须用冒号 2操作码:指明指令功能。 例:MOV move传送 XCH exchange交换 ANL_and logic与逻辑运算 XRL_exclusive or异或运算 MUL Multiply乘法 RR rotate right右循环 SJMPshort jump短跳转 RETreturn子程序返回 3、操作数或操作数地址表示参加运算的数据或数据的有效地址。 操作数一般有以下几种形式: (1)没有操作数项,操作数隐含在操作码中,如RET指令: (2)只有一个操作数,如CPLA指令: (3)有两个操作数,如MOVA,#00H指令,操作数之间以逗 号相隔:有三个操作数,如CJNE A,#OOH,NEXT指令,操作数之间 也以逗号相隔,操作码与操作数之间用空格。 4、注释是对指令的解释说明,用以提高程序的可读性:注释前
必须加分号(:)。 5、换行表示一条指令结束 说明: 1、MCS一51单片机是8位机,可识别2=256种操作代码,实际 中有255种操作码O0H至FFH,A5H无对应操作)。 2、256种操作有111条指令,用汇编语言表达操作代码时,只要 熟记42种助记符。同一种指令所对应的操作码可以多至八种(如指 令中Rn对应寄存器R0-R7)。 3、MCS-51的指令系统按指令功能分为五大类: ①数据传送类②算术运算类③逻辑运算类④控制转移类⑤ 位操作类 3.2、指令寻址方式 操作数指出了参与操作的数据或数据的地址。CPU寻找操作数 或操作数地址的方法称为寻址方式。而操作数类型有: 位(b)一位寻址区中的一位二进制数据 字节(B)一8位二进制数据 字(W)一16位双字节数据 MCS-51指令系统共使用了7种寻址方式,包括立即数寻址、寄 存器寻址、直接寻址、寄存器间接寻址、变址寻址、相对寻址和位寻 址等。 一、直接寻址 指令直接给出了操作数的地址,即:指令本身含有操作数的(8 位或16位)地址。可以直接寻址的存储器有内部RAM区和特殊功
能寄存器SFR。 例:MOVA,30H;将RAM30H单元内容送累加器 这里30H是操作数在RAM中的地址,如下图。 累加器 30H操作数x 说明: 1、很明显,直接寻址的指令长度是两个或三个字节,(操作数占 1或2字节)。 2、当访问内部RAM低128单元时,直接给出单元地址。 3、当访问SFR时可以直接给出地址,也可以给出寄存器符号, (直接寻址是访问SFR的唯一方法)例:MOVA,8OH可 以写成MOVA,P0 后者用SFR中寄存器的名字取代它的物理地址8OH。我们提倡 使用SFR中寄存器名称来代替直接地址 如:MOVA,SBUF:串口数据缓冲器数据送A 二、立即寻址方式 指令中直接给出(8位或16位)操作数(叫立即数)。一般用于 为寄存器或存储器赋常数初值。 MOVA,#30H;将(8位)立即数30H送累加器A MOV DPTR,#200OH:16位立即数2000H送DPTR寄存器
DFTR 累扣器A 00H -30H -20 MOV P1,#55H ;将立即数55H送P1口 MOV20H,#55 :将立即数55H送20H单元 MOV A,#0FOH ;将立即数OFOH送累加器A 注意:立即数前面必须加“#号,以区别立即数和直接地址 即:MOVA,#30 H MOV A,30H两者的区别 三、寄存器寻址 寄存器寻址是以寄存器中的内容为操作数,(寄存器名为操作数 地址) 寻址范围包括:工作寄存器R0~R7、累加器A、通用寄存器B、 地址寄存器DPTR。 注意:在使用工作寄存器(4组32个)时,首先要通过程序状 态寄存器PSW的RS1RS0来选择当前寄存器组 例:RS1RS0=01为二组工作寄存器(08H一OFH)。则执行MOV R1,A指令后,内部RAMO9H(R1)单元的值就变为20H。(设累 加器A的内容为20H) 累加器A 内部RAM R1(09H) 采用寄存器寻址的指令如下:
MOVP1,A:将累加器A的内容送到P1口 MOVP1,R4;将寄存器R4的内容送到P1口 CLRA;将累加器A清0 四、寄存器间接寻址 寄存器间接寻址:指令给出的寄存器中的内容为操作数的地址: 例:MOVA,@R0: 设指令执行前A=20H,R0-40H,地址为40H存储器单元内容如 图所示。执行指令后,A=28H,R0=40H,(40H=28H 41H21H 40H28H 再如:MOVR0,#30H;立即数送R0寄存器 MOVA,@R0;从RAM的30H单元取数送累加器A 注意: 1、间接寻址寄存器前面必须加上符号“@”。 MOVA,@R0和MOVA,R0指令的区别。 2、寄存器间接寻址方式可用于访问内部RAM(低128B)或外 部RAM. 3、访问内部RAM低128B或外部RAM的低256个字节时,可 采用R0或R1作为间址寄存器。 4、访问外部RAM(64K),还可用数据指针DPTR作为间址寄 存器
5、在指令上内部RAM与外部RAM有区别,MOV(内部),MOVX (外部) 6、间址方式的指令不能访问SFR中的单元。如下面的程序是错 误的: MOV RI,#80H MOVA,@R1(因为8OH为SFR的物理地址) 7、尽管片内与片外的RAM单元的0OH-FFH地址相重叠但由于 指令的不同不会发生地址混乱。 FFH SFR 80H 7FH 翮 00H 低128那 OOH-7FH 例:分析下列语句的功能: 1、MOVA,20H:片内20H单元中的数据放入累加器A(直接 寻址) 2、MOVR0,#20H;20H立即数放入R0中(立即寻址) MOVX A,@R0:片外20H(R0中为20H)中的数放入A(寄 存器间接寻址》 3、MOVR0,#20H;20H立即数放入R0中(立即寻址) MOVA,@R0:片内20H(R0中为20H)中的数放入A(寄存
器间接寻址) 4、MOVX A,@DPTR:将DPTR指定的外部RAM中的数放入 A中(寄存器间接寻址) 五、变址寻址 变址寻址是指将基址寄存器(DPTR或PC)与变址寄存器(A) 的内容相加,结果作为操作数的地址。即:数据地址=基地址+偏 移量 例:MOVC A,@A+DPTR;将累加器A和基址寄存器DPTR 的内容相加,相加结果作为操作数存放的地址,再将操作数取出来送 到累加器A中。 若:(A)=11H,(DPTR)=F1H,(0102H)=35H:则上述操 作的结果(A)=35H 注意:1、变址指令只适用于对ROM存储器的访问: 2、变址指令只有三条 MOVC A,@A+DPTR MOVC A,@A+PC JMPA,@A+DPTR:无条件转移指令 3、尽管编址寻址教复杂,但该指令为单字节指令 例:已知ROM中0302H单元有一个数x,现要把它送到累加器 A中,试编程。 MOV DPTR,#0300H :立即数送DPTR MOV A,#02H ;立即数送累加器A MOVC A,@A+DPTR :从ROM的00302单元取数送A
六、相对寻址 相对寻址:指令中的操作数(偏移量)与程序计数器PC的当前 值相加,其结果作为跳转指令的转移地址(也称目的地址)。 例:SMP54H:是54H与PC当前的内容(存放54H的下 一单元)相加,结果再送回PC中,成为下一条将要执行指令的地址。 设:SJMP54H的机器码80H54H存放在2000H处,当执行到该 指令时,先从2000H和2001H单元取出指令,PC自动变为2002H: 再把P℃的内容与操作数54H相加,形成月标地址2056H,再送回 PC,使得程序跳转到2056H单元继续执行。 程疗存储区 2000H X 2056 2056H 注意: 1、程序计数器PC的当前值是指取完指令之后的值(存放操作 数的下一单元),即:原地址十转移指令的字节数(2或3字节) 2、目标地址的计算:目标地址=原地址+转移指令的字节数十 偏移量 3、相对寻址只适用于对ROM存储器的访问,出现在相对转移 指令中。 4、MCS-51单片机的指令系统中,有两类转移指令:相对转移,绝