【单片机原理及接口技术】【理解】七种寻址方式

七种寻址方式

1、寄存器寻址

由指令指出寄存器组R0~R7或者其它寄存器(仅 A,B,DPTR,Rn 4个)的内容 作为操作数。

MOV A, R0; (A)=(R0) -----将 R0地址上的内容赋给 A
MOV P1, A ; (A)=(P1)
ADD A,R0; (A)=(A)+(R0) ----- 将R0地址上的内容 与 A地址上的内容相加 再赋给 A
INC Rn ; INC是自加一的作用 (Rn) = (Rn)+1 Rn = R0…R7 ,三位二进制来表示

2、直接寻址(操作数是片内RAM)

指令中所给出的操作数是片内RAM单元的地址。在此地址单元中存放着一个被操作的数。

MOV A,40H ; A = (40H)
MOV A, 3AH ;(A) = (3AH)
MOV A,P1 ;(A) = (P1口) 或者写成 MOC A, 90H ;90H是P1口的地址

注意
1.给的是地址,但是取的是其中的内容。
2.直接寻址的地址占一字节,故一条直接寻址方式的指令至少占内存2个单元

3、立即数寻址

指令操作码后面紧跟的是一字节或两字节操作数,用#表示,以区别直接地址。

MOV A, 3AH ;(A) = (3AH) ----此处的3AH 指的是3AH单元里的内容
MOV A, #3AH ;(A) = 3AH ----把3AH这个数本身送累加器A。

89c51/s51 有1条指令要求操作码后面紧跟的是 2字节立即数

MOV DPTR, #DATA16
MOV DPTR, #2000H ; (DPTR)= 2000H 操作码是8位,20 00 是16位

4、寄存器间接寻址(两把抽屉两把钥匙,出门只带1把就行)

操作数的地址事先存放于某个寄存器中,寄存器间接寻址是把指定寄存器的内容作为地址,由该地址所指定的单元内容作为操作数。

MOV A,@R0 ;-----将片内RAM 65H单元的内容 47H 送 A ,R0中的内容为 65H

注意:
1.访问片内RAM 低128字节片外RAM低地址的256个单元时,用R0R1地址指针
2.在访问全部64KB外部RAM时,使用DPTR作地址指针进行间接寻址

5、变址寻址(基址寄存器 + 变址寄存器间接寻址)

变址寻址是以某个寄存器的内容为基地址,然后再这个基地址的基础上加上地址偏移量形成真正的操作数地址。
A为变址寄存器, 数据指针 DPTR 或 PC 为基址寄存器,地址偏移量是累加器A的内容。
以DPTR 或 PC 的内容与累加器A 的内容之和作为操作数的16位程序存储器地址。

MOVC A, @A+DPTR ; (A) = ((A)+(DPTR))

注意:
1.特征是带有 @
2.变址寻址方式只能访问程序存储器
3.多用于查表操作。

6、相对寻址

只出现在相对转移指令中。指令执行时,是以当前的 PC值加上指令中规定的偏移量 rel 而形成实际的转移地址。
一般把相对转移指令操作码所在的地址称为源地址,转移后的地址称为目的地址
所以有: 目的地在 = 源地址 + 2(相对转移指令字节数) + rel

设rel=75H,CY =1
JC rel
源地址为1000H,转移的目标地址是1077H。

7、位寻址(片内RAM(20H~2FH)某一单元中的一位)

采用位寻址方式的指令的操作数将是8位二进制数中的1位。
注意:内RAM有2个区域可以位寻址:
1.20F~2FH 的16个单元中的128位;
2.字节地址能被8整除的特殊功能寄存器(SFR)。

每天进步一点点 笔记仅供自学,用来回看复习,不一定适合你,如有错误请指出。

这段代码是一段基于8051单片机的汇编代码,实现了一个简单的计数器并将计数器的值以数码管的形式显示出来。 第1行:ORG 0x0000,设置程序存储器的起始地址为0x0000。 第2行:MOV P0, #0xFF,将P0口的引脚设置为输出口,并将其电平置高。 第3行:MOV DPTR, #TABLE,将段码表的起始地址存入DPTR寄存器。 第5行:MOV R0, #0x00,将R0寄存器的值清零。 第7行:DISPLAY:,设置一个标签,用于后面的跳转。 第8行:MOV A, R0,将R0寄存器的值放入累加器A中。 第9行:MOVC A, @A+DPTR,通过DPTR访问段码表的内容,并将其放入累加器A中。 第10行:MOV P0, A,将累加器A中的值发送到P0口,即用数码管显示出来。 第11行:ACALL DELAY,调用延时函数,用于控制数码管的刷新速度。 第12行:INC R0,将计数器自增。 第13行:CJNE R0, #10, DISPLAY,判断计数器是否达到10,若未达到则跳转到DISPLAY标签处继续显示。 第14行:SJMP LOOP,跳转到LOOP标签处,循环执行。 第16行:MOV R1, #50H,设置延时计数器的初值为0x50。 第17行:DELAY_LOOP:,设置一个标签,用于后面的跳转。 第18行:DJNZ R1, DELAY_LOOP,将延时计数器自减,并判断是否为0,若不为0则跳转到DELAY_LOOP标签处继续延时。 第19行:RET,返回主程序。 第21行:TABLE:,设置一个标签,用于定义段码表。 第22行:DB 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80,0x90,定义了共阳极数码管的段码表,分别对应0~9的显示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

KevinGuo457

哈哈哈资助我买两包辣条叭

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值