寻址方式与数据传送类指令
汇编语言基础知识
基础格式
先来介绍MCS-51汇编语言指令由以下的几个部分构成:
【标号:】操作码【目的操作数】【,源操作数】【;注释】
其中【】中的内容为可选项。
标号:又称作是指令地址符号。
操作码:助记符所表示的指令的操作功能。
操作数:写在左边的称为目的操作数(操作结果存放的寄存器或存储器单元地址)写在右边的称之为源操作数(表示操作数的来源)
注释用‘”’与指令隔开。
符号说明
1.#data;8位立即数(立即数:通常是指在立即寻址方式指令中给出的数,也就是指令中运用到的常数,可以代表地址,也可以代表数据)
2.#data16:16位立即数
3.direct:表示8位内部数据存储器单元的地址。
4.Rn:n=0~7,表示当前选中的寄存器区的8个工作寄存器R0 ~ R7。
5.Ri:i=0或1,可做地址指针即间址存储器。类似c语言中的*p
6.Addr11,Addr16:表示11位和16位的地址。
7.rel:偏移量,相对于下一条指令的第一个字节计算。
8.DPTR:数据指针
9.@:间址寄存器以及基址寄存器的前缀
10.A:累加器ACC
11.B:专用寄存器
数据传送指令MOV
一般不影响标志位,只有堆栈操作(PUSH、POP)可以直接修改PSW。
MOV:片内数据传送指令
MOVX: 片外数据传送指令
MOVC:程序存储器数据传送指令
寻址方式
- 立即数寻址
MOV A,#26H ;把立即数26H送入到ACC中
- 直接寻址
操作数所在的存储单元地址放入指令
MOV A,P1 ;将P1的数据送入到ACC
MOV A,76H ;区分立即数寻址,这里指把76H地址中的内容送入到ACC
- 寄存器寻址
寄存器中的内容是操作数
MOV A,R1 ;将寄存器R1中的内容送入到ACC
- 寄存器间接寻址
寄存器前用“@”标志,指定寄存器中的内容是操作数的地址,该地址对应的存储单元中的内容是操作数。
MOV A,@R0 ;注意,这里只能是@R0或者@R1。
这里举个例子理解:把操作数45H放在内部RAM的3FH单元中,地址信息3FH存储在R0寄存器中。这条指令,是将R0所指的3FH单元中的内容45H送入到ACC中。此时(A)=45H
5. 变址寻址
是将程序指针PC或者是数据指针DPTR作为基址寄存器,以累加器A作为变址寄存器,两者内容相加(基地址+偏移量)形成16位操作数地址:@A+PC
MOVC A,@A+PC
- 相对寻址
以程序计数器PC的当前值为基地址,与指令中第二字节给出的相对位移量rel相加,所得和即为转移地址。
指令执行完后,PC当前值为该指令首字节所在单元地址+2
有目的地址=当前PC值+rel - 位寻址
给出直接地址
实例:基于89c51流水灯程序c与asm的对照
c语言版本
#include<reg52.h>
void Delay(void);
void main(void)
{
unsigned int i=0;
unsigned char cnt=0;
while(1)