一、立即寻址
1010H:MOV A,#55H
指令解析
地址 1010H
:
1010H
是这条指令存储在程序存储器中的地址。汇编语言程序由指令组成,每条指令都有一个对应的内存地址。
指令 MOV A, #55H
:
MOV
是一个数据传送指令,用于将数据从一个位置移动到另一个位置。A
是累加器寄存器,它用于算术运算和数据处理。#55H
是一个立即数,代表值为55H
的常数。
执行过程
当程序执行到地址 1010H
时,以下操作会被执行:
-
将立即数加载到累加器:
- 将常数
55H
直接加载到 A 寄存器中。
- 将常数
-
结果:
- 指令执行后,累加器 A 的内容将为
55H
。在此之后,你可以使用 A 寄存器进行各种运算或输出。
- 指令执行后,累加器 A 的内容将为
实际代码示例
以下是一个简单的80C51汇编程序示例,其中包含 MOV A, #55H
指令:
ORG 1010H ; 程序起始地址为1010H
START: ; 程序标签MOV A, #55H ; 将立即数55H加载到累加器AMOV P1, A ; 将A的值输出到端口P1SJMP $ ; 无限循环,程序在此处停留
二、直接寻址
2000H:MOV A,55H
指令解析
- 这里的
55H
是一个地址,指向内存中的一个具体位置。该指令的作用是将内存地址55H
中存储的内容加载到累加器 A 中。
实际代码示例
ORG 2000H
START:MOV 55H, #0AH ; 将立即数0AH存储到内存地址55HMOV A, 55H ; 将内存地址55H中的内容(即0AH)加载到累加器A
- 执行
MOV 55H, #0AH
:将立即数0AH
存储到内存地址55H
。 - 执行
MOV A, 55H
:将内存地址55H
中的内容(即0AH
)加载到累加器 A。
采用直接寻址的储存空间
1、内部RAM:
- 内部RAM的地址范围通常为00H到7FH,共128个字节。这部分存储空间可以直接通过地址进行寻址,例如
MOV A, 30H
,表示将内部RAM地址30H的内容加载到累加器A中。
2、特殊功能寄存器(SFRs):
- 80C51有一些特殊功能寄存器,用于控制单片机的各个功能,比如定时器、串口、I/O端口等。这些寄存器的地址范围通常为80H到FFH。例如,
MOV A, P1
可以直接访问端口P1。
需要注意的是,直接寻址不适用于外部RAM,因为外部RAM的地址需要通过间接寻址或使用数据指针寄存器(DPTR)来访问。
三、立即寻址与间接寻址
MOV A, 55H
将 内存地址55H
中的内容加载到累加器 A。MOV A, #55H
将 立即数55H
直接加载到累加器 A。
四、寄存器寻址
MOV A, R0 ; 将寄存器R0中的数据加载到累加器A中
指令将 R0
中的值传送到累加器 A 中。
MOV R1, A ; 将累加器A中的数据存储到寄存器R1中
指令将累加器 A 的值存储到寄存器 R1 中。
MOV R2, R1 ; 将寄存器R1中的数据传送到寄存器R2
指令将寄存器 R1 中的值复制到寄存器 R2 中。
实际代码示例
ORG 0000H ; 程序起始地址
START: ; 程序标签MOV R0, #55H ; 将立即数55H加载到寄存器R0中MOV A, R0 ; 将寄存器R0中的数据加载到累加器A中MOV R1, A ; 将累加器A中的数据存储到寄存器R1中MOV P1, R1 ; 将寄存器R1的值输出到端口P1SJMP $ ; 无限循环,程序在此处停留
说明
- ORG 0000H: 指示汇编器从地址
0000H
开始放置代码。 - MOV R0, #55H: 将立即数
55H
加载到寄存器 R0。 - MOV A, R0: 从寄存器 R0 中加载数据到累加器 A。
- MOV R1, A: 将累加器 A 的数据存储到寄存器 R1。
- MOV P1, R1: 将寄存器 R1 的值输出到端口 P1。
- SJMP $: 使程序无限循环,防止继续执行未定义的代码。
五、寄存器间接寻址
MOV DPTR, #2000H ; 将数据指针(DPTR)设置为内存地址2000H
MOVX A, @DPTR ; 从内存地址(DPTR指向的地址)加载数据到累加器A
DPTR
是一个数据指针寄存器,它指向内存地址2000H
。MOVX A, @DPTR
指令将DPTR
指向的内存地址的内容加载到累加器 A 中。
MOV DPTR, #2000H ; 将数据指针(DPTR)设置为内存地址2000H
MOVX @DPTR, A ; 将累加器A的值存储到DPTR指向的内存地址
MOVX @DPTR, A
指令将累加器 A 中的内容存储到DPTR
指向的内存地址2000H
。
ORG 0000H ; 程序起始地址
START: ; 程序标签MOV DPTR, #2000H ; 将数据指针DPTR设置为2000HMOV A, #55H ; 将立即数55H加载到累加器AMOVX @DPTR, A ; 将累加器A的值存储到DPTR指向的内存地址2000HMOVX A, @DPTR ; 从内存地址2000H加载数据到累加器AMOV P1, A ; 将累加器A的值输出到端口P1SJMP $ ; 无限循环,程序在此处停留
- ORG 0000H: 指示汇编器从地址
0000H
开始放置代码。 - MOV DPTR, #2000H: 将数据指针
DPTR
指向内存地址2000H
。 - MOV A, #55H: 将立即数
55H
加载到累加器 A 中。 - MOVX @DPTR, A: 将累加器 A 中的值存储到内存地址
2000H
。 - MOVX A, @DPTR: 从内存地址
2000H
加载数据到累加器 A 中。 - MOV P1, A: 将累加器 A 的值输出到 P1 端口。
- SJMP $: 无限循环,程序停在此处,防止执行未定义的代码。
MOV与MOVX的区别
六、寄存器寻址和寄存器间接寻址
-
寄存器寻址(Register Addressing):
- 在这种寻址模式下,操作数直接存储在寄存器中,指令指定一个寄存器,处理器直接从这个寄存器中读取数据或将数据写入该寄存器。
- 例子:
MOV A, R0
,将寄存器 R0 中的数据加载到累加器 A 中。
-
寄存器间接寻址(Register Indirect Addressing):
- 在这种寻址模式下,寄存器的内容被视为一个内存地址,指令指定一个寄存器,该寄存器的值指向要访问的数据的内存地址。
- 例子:
MOV A, @R0
,从寄存器 R0 指向的内存地址加载数据到累加器 A 中。