历史上的今天
今天是:2025年06月28日(星期六)
2019年06月28日 | 80C51单片机的指令系统(二)寻址方式
2019-06-28 来源:eefocus
4.2.1 指令系统中使用的常用符号:
Rn: 当前寄存器工作区中的寄存器, 其中, n=0 -- 7;
direct: 内部数据存储器地址, 可指定一个内部RAM单元(0-- 127)或一个专用寄存器(128-- 255);
@Ri: 通过R1或R0间接寻址, 指定数据存储器RAM中的一个单元(0-- 255);
#data: 在指令中指明8位常数;
#data16: 在指令中指明16位常数;
addr11: 11位目的地址, 用在ACALL或AJMP指令中,表示调用或转移地址, 寻址范围为2KB;
addr16: 16位目的地址, 用在LCALL或LJ MP指令中, 表示调用或转换地址, 寻址范围为64KB;
rel: 8位偏移量, 用补码表示, 用在SJMP等转移指令中, 寻址范围为 - 128-- + 127;
bit: 表示位寻址空间中的位地址, 8 位, 寻址范围为0-- FFH。
4.2.2 80C51单片机指令系统的寻址方式:

1、立即寻址---是指操作数在指令操作数域直接给出:
操作数域直接给出:

2、直接寻址---是指操作数的地址直接在指令操作数域给出:
可访问3 种地址空间
(1)内部RAM低128单元: 00H-7F
MOV A, 3CH ; (A)<---(3CH)
(2)特殊功能寄存器SFR, 唯 一方式80H-0FFH
MOV A, P1 ; (A) <---(P1口)
MOV A, 90H
(3)211个位地址空间
MOV C, 30H ; (Cy)<---(30H)
MOV A, 30H ; A <---(30H)

例: MOV A , 30H; 机器码为E530H
指令功能是把直接地址30H单元的内容送累加器A, 即(30H)--->(A)如图所示。

例: MOV DPTR , #1234h
(DPH)=12H
(DPL)=34H
注意: 立即数前加 " # "号,以区别直接地址
例如: MOV A, #30H ; (A)<--- 30H
MOV A, 30H ; (A)<---(30H)
3、寄存器寻址---操作数存放在寄存器中:
MOV A , RO
MOV R0 , #01001111B

【例4-9】 MOV A,R1 ;(A)<---(R1)

例如: MOV A, R3 ;机器码为 0EBH 指令功能是把当前R3中的操作数送累加器A。指令执行示意图如图3-6所示。设 ( R3) =12H

4、寄存器间接寻址:
是指寄存器中存放的是操作数的地址,而操作数在存储器中,通过寄存器可间接得到。
寄存器间接寻址用符号''@"表示
寄存器间接寻址可寻址范围如下:
(1)内部RAM低128单元, 地址范围00H~7FH,用Ri(i=0,1)和SP作为间址寄存器;
(2)与P2口配合使用, 用Ri指示低8位地址, 可寻址片外数据存储器或I/O口的64kB7区域;
(3)DPTR间接寻址寄存器, 可寻址片外程序存储器或数据存储器包括1/0 口的各自的64kB 区域。
例如: MOV A, @R1 ;机器码 E7H
设 (R1) =60H , (60H) =50H , 执行结果
(A)=50H, 该指令执行过程如图4-5所示。

5、变址寻址:
基址寄存器+变址寄存器的tB]接寻址方式
DPTR/PC , A
MOVC A, @ A+DPTR
(A)<---((DPTR) + (A))
MOVC A, @ A+PC
(A)<---( (PC )+ (A))
JMP @ A + DPTR
(PC)=(A)+(DPTR)
MOVC A,@A+DPTR ;(A)←((A)+(DPTR))


6、相对寻址
是以程序计数器PC的当前值为基地址, 加上指令中给出的偏移量rel作为转移目的地址。转移目的地址=下一条指令地址+rel
【例4-12】 JC 80H



7、位寻址 bit
位寻址是指对一些内部RAM和特殊功能寄存器进行位操作时的寻址方式。
位寻址范围:
(1) 内部RAM的位寻址区, 共16个单元的128位, 单元地址为20H 2FH , 位地址为00H~7FH。可用直接位地址或字节地址加位的表示方法。
例如: MOV C, 7AH
或 MOV C, 2FH. 2
(2)特殊功能寄存器SFR可供位寻址的专用寄存器共11个,实有位地址位83 位。位地址有4 种表达方式 。

1) 直接使用位地址 3 ) 单元地址加位的表示法
MOV C, 0D6H MOV C, 0D0H.6
2) 位名称表示法 4 ) 专用寄存器符号加位的表示法
MOV C , AC MOV C, PSW.6

特点1: 内部数据存储器与内部I/O口统一编址
1、内部数据存储器的寻址方式
1)00H~1FH 寄存器寻址 4 组R0~R7 : Rn
直接寻址 direct
寄存器间接寻址 @R0,@R 1
例: (01H)--->(02H)
MOV 02H,01H ;源寻址和目的寻址均为直接寻址
MOV C R2 ,01H ;源寻址为直接寻址,目的寻址为寄存器寻址
MOV R0,#01 H
MOV 02H,@R0 ; 源寻址为寄存器间接寻址,
目的寻址为直接寻址
2)20H~2FH 可位寻址区的寻址方式
字节寻址方式: 直接寻址 direct
寄存器间接寻址@R0,@R1
位寻址: bit 直接寻址
例: MOV 26H,C; 位寻址 (26H) 1位
MOV 26H,A; 字节寻址 (26 H) 8 位
3)30H~7FH 数据缓冲区的寻址方式
字节寻址方式: 直接寻址 direct
寄存器间接寻址@R0,@R1
例: MOV 56H,A; 字节寻址 ( 56H ) 8位
MOV R0,#66H
MOV @R0,#56H
可以将用户堆栈设在该区内, 堆栈指针SP
2、SFR及I/O口的操作---只能直接寻址

3、关于A累加器有两种寻址方式:

4、可做片内RAM的指针有:

特点2: 片外数据存储区和外部扩展的I/O口的寻址方式
史海拾趣
|
随着手持通信设备市场的快速发展,手机的功能逐渐增多。现在手机已经不只是用于语音通信的手持设备,而成为集成了短信、彩信、上网以及移动办公等附加功能的嵌入式通信平台。 集成了这些功能的手机被称为智能手机。近年,嵌入式 ...… 查看全部问答> |
|
请问大家一个sdk定制问题 在定制系统时,我选择了开发板给的bsp,编译通过后生成新的sdk时却出现问题。 一般在生成新的sdk时,emulation项中可以设置长、宽的。而我这却是灰色,无法设置。当我编译sdk后安装成功后,在tools-》device emulator ma ...… 查看全部问答> |
|
我采购了一块2440的ARM开发板,已经做了下面的工作: 1、通过USB与MS的SYNC可以与我的WINDOWS XP互联及同步,并可以在电脑与开发板之间随意复制与粘贴文件。 2、用VS2005(C#)开发了基于WINCE5.0的程序,而且VS2005与WINCE5.0的开发板也可以互联 ...… 查看全部问答> |
|
各位高手: 我安装EVC,安装了SP4,然后无论我用哪个SDK建立工程,编译都会报错: --------------------Configuration: WCETest - Win32 (WCE ARMV4) Release-------------------- Compiling resources... Error executing rc.exe. WCETest.ex ...… 查看全部问答> |
|
获取电池电量函数问题GetSystemPowerStatusEx2 我查了我的sdk里已经包含了Coredll.lib和Winbase.h,为什么我在EVC里调用GetSystemPowerStatusEx2函数,编译时说没有定义呢,头文件我已经加了的… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 09:29 编辑 [ 本帖最后由 孤独剑 于 2011-5-6 19:27 编辑 ] … 查看全部问答> |
|
AD采集正弦波输出同频同相的方波。可是有错误,谁能把我看看。在下万分感谢。 #include double pingjun=0; long caiyangzhi; double caiyang (); void main (void) { WDTCTL = WDTPW + WDTHOLD; & ...… 查看全部问答> |




