51单片机的汇编伪指令

目录

[一、ORG 汇编起始地址命令](#一、ORG 汇编起始地址命令)

1、功能

2、语法格式

3、使用示例

4、注意事项

[二、END 汇编终止命令](#二、END 汇编终止命令)

1、功能

2、语法格式

3、使用示例

4、注意事项

[三、EQU 赋值命令](#三、EQU 赋值命令)

1、功能

2、语法格式

3、使用示例

4、注意事项

[四、BIT 位定义命令](#四、BIT 位定义命令)

1、功能

2、语法格式

3、使用示例

4、注意事项

[五、DB 定义数据字节命令](#五、DB 定义数据字节命令)

1、功能

2、语法格式

3、使用示例

4、注意事项

[六、DW 定义数据字节命令](#六、DW 定义数据字节命令)

1、功能

2、语法格式

3、使用示例

4、注意事项

[七、DS 定义存储区命令](#七、DS 定义存储区命令)

1、功能

2、语法格式

3、使用示例

4、注意事项


在 51 单片机的汇编语言编程中,伪指令起着重要的作用。

伪指令并非真正的指令,不会生成机器码,不像真正的指令那样在程序运行时被执行。而是在汇编过程中,被汇编程序用来指导汇编工作的进行

下面将详细介绍一些常用的 51 单片机汇编伪指令。

一、ORG 汇编起始地址命令

1、功能

ORG 指令的作用是规定后续程序数据块在存储器里起始地址。在汇编时,汇编程序会依据 ORG 指令所指定的地址,将程序和数据存于对应的存储单元。

如果不使用ORG,则汇编得到的目标程序将从0000H地址开始。

2、语法格式

ORG 表达式

这里的"表达式"是一个16位的地址值,能够是具体的数值,也可以是已经定义的符号地址

3、使用示例
XML 复制代码
ORG 0000H
    LJMP MAIN     ; 跳转到主程序

ORG 0030H
MAIN:
    MOV SP, #60H  ; 设置堆栈指针
    ; 主程序代码
    SJMP $        ; 程序暂停
END

在这个例子中:

ORG 0000H 规定了后续的指令 LJMP MAIN 会从地址 0000H 开始存放。0000H 是 51 单片机复位后的起始地址,通常会在此处放置一条跳转指令,从而跳转到主程序。

ORG 0030H 表明后续的主程序代码从地址 0030H 开始存放。0030H 之后是用户程序的起始地址,因为 0000H - 002FH 被中断服务程序的入口地址占用了。

4、注意事项

一个源程序里可以多次使用 ORG 指令,从而指定不同程序段或数据块的起始地址。不过,地址值必须是从小到大依次排列,且不能有重叠。

ORG 指令通常处于程序或数据块的起始位置用于确定它们在存储器中的起始存放地址。

二、END 汇编终止命令

1、功能

END 指令用于告知汇编程序,源程序已经结束整个源程序中只能有一条END命令

汇编程序在对源文件进行汇编处理时,一旦遇到 END 指令,就会停止对后续内容的汇编操作。 也就是说,END 指令标志着整个汇编程序的结束点,其后的代码将不会被汇编成机器码。

2、语法格式

END [表达式]

其中,"表达式" 是可选的。在 51 单片机汇编中,这个表达式通常是主程序的起始地址。不过在实际应用里,很多时候会省略这个表达式。

3、使用示例
XML 复制代码
ORG 0000H
    LJMP MAIN     ; 跳转到主程序

ORG 0030H
MAIN:
    MOV SP, #60H  ; 设置堆栈指针
    ; 主程序代码
    SJMP $        ; 程序暂停

END MAIN

在上述示例中:

程序开头的 ORG 0000H 让 LJMP MAIN 从地址 0000H 开始存放,0000H 是 51 单片机复位后的起始地址。

ORG 0030H 使后续的主程序代码从地址 0030H 开始存放。

最后的 END MAIN 表明汇编程序到此结束,并且指定了主程序的起始地址为 MAIN。如果省略 MAIN,写成 END 也是可行的,这在实际编程中更为常见。

4、注意事项

**① 唯一性:**在一个汇编源程序里,END指令只能出现一次,并且位于程序的末尾 。若程序中存在多个END指令,汇编程序在遇到第一个END指令时就会停止汇编,其后的代码将被忽略。

**② 位置准确性:**要保证 END 指令处于所有有效代码之后,不然其后的代码将不会被汇编成机器码,也就无法在单片机上运行。

三、EQU 赋值命令

1、功能

EQU 指令的作用是给一个符号名赋予特定的值或者表达式,也就是将一个符号名定义为一个常量,类似于C语言中的宏定义常量。

这样在后续的程序中,就可以使用这个符号名来代替所定义的值,提高代码的可读性和可维护性。一旦使用 EQU 定义了符号名,在整个程序中该符号名的值就不能再被重新定义。

2、语法格式

符号名 EQU 表达式

其中,**"符号名"是自定义的标识符,遵循汇编语言标识符的命名规则;"表达式"**可以是一个具体的数值、地址、寄存器名或者由它们组成的合法表达式。

3、使用示例

数值常量定义符号名

XML 复制代码
COUNT EQU 10
ORG 0000H
START:
    MOV R0, #COUNT ; 将COUNT的值10传送到寄存器R0
    ; 其他代码
    SJMP $
END

在这个例子中,COUNT 被 EQU 定义为 10,在后续代码里,MOV R0, #COUNT 就相当于 MOV R0, #10,这使得代码的含义更加清晰。

地址常量定义符号名

XML 复制代码
DATA_ADDR EQU 30H
ORG 0000H
START:
    MOV A, DATA_ADDR ; 将地址30H中的内容传送到累加器A
    ; 其他代码
    SJMP $
END

这里,DATA_ADDR 被定义为地址 30H,在程序里使用 DATA_ADDR 就等同于使用 30H。

寄存器定义符号名

XML 复制代码
TEMP EQU R1
ORG 0000H
START:
    MOV TEMP, #20H ; 将立即数20H传送到寄存器R1
    ; 其他代码
    SJMP $
END

在这个示例中,TEMP 被定义为寄存器 R1,使用 TEMP 就相当于使用 R1。

4、注意事项

**① 不可重复定义:**使用 EQU 定义的符号名在整个程序中不能被重新定义。如果尝试重新定义,汇编程序会报错。

**② 先定义后使用:**必须先使用 EQU 定义符号名,然后才能在程序中使用该符号名。如果在定义之前就使用,汇编程序无法识别该符号名。

四、BIT 位定义命令

1、功能

BIT 指令的主要功能是为一个位地址赋予一个符号名类似于C语言中的宏定义常量。

在 51 单片机里,存在可位寻址的区域,通过 BIT 指令**可以使用自定义的符号名来表示这些位地址,**这样能增强程序的可读性和可维护性,让程序员在编写程序时可以使用更具含义的符号来操作位。

2、语法格式

符号名 BIT 位地址

其中,"符号名"是用户自定义的标识符,要遵循汇编语言标识符的命名规则;"位地址" 可以是直接的位地址,也可以是可位寻址的寄存器或存储器单元的位名称。

3、使用示例

直接位地址定义符号名

XML 复制代码
FLAG BIT 20H.0
ORG 0000H
START:
    SETB FLAG ; 将位地址20H.0置1
    ; 其他代码
    SJMP $
END

在这个例子中,FLAG 被 BIT 指令定义为位地址 20H.0。在后续的程序中,SETB FLAG 就相当于 SETB 20H.0,将位地址 20H.0 置为 1。

寄存器的位定义符号名

XML 复制代码
CY_FLAG BIT PSW.7
ORG 0000H
START:
    MOV A, #0FFH
    ADD A, #1 ; 执行加法操作,产生进位
    JB CY_FLAG, OVERFLOW ; 如果进位标志位PSW.7为1,跳转到OVERFLOW处
    ; 其他代码
    SJMP $
OVERFLOW:
    ; 处理溢出情况
    SJMP $
END

这里,CY_FLAG 被定义为程序状态字寄存器 PSW 的第 7 位(即进位标志位 CY)。在程序中,使用 CY_FLAG 来判断是否产生进位,提高了代码的可读性。

4、注意事项

① 符号名的唯一性:使用 BIT 指令定义的符号名在整个程序中必须是唯一的,不能重复定义,否则汇编程序会报错。

**② 位地址的有效性:****指定的位地址必须是可位寻址的。**在 51 单片机中,可位寻址的区域包括内部数据存储器的 20H - 2FH 单元(共 128 位)以及部分特殊功能寄存器。如果使用了不可位寻址的地址,汇编程序会报错。

**③ 先定义后使用:**必须先使用 BIT 指令定义符号名,然后才能在程序中使用该符号名。如果在定义前就使用,汇编程序无法识别该符号名。

五、DB 定义数据字节命令

1、功能

DB 指令的全称为 "Define Byte",即定义字节。它的主要功能是在程序存储器中定义一个或多个字节的数据,这些数据可以是常数、字符或者表达式的值。

DB指令所定义的数据会按照顺序依次存放在指定的存储单元中

2、语法格式

[标号:] DB 表达式1 [, 表达式2, ...]

"标号" 是可选的,它代表了 DB 指令所定义的第一个数据字节的存储地址。

"表达式" 可以是十进制或十六进制的常数字符(用单引号括起来)、ASCII 码值或者由它们组成的表达式。多个表达式之间用逗号分隔。

3、使用示例

定义常数数据

XML 复制代码
ORG 1000H
DATA: DB 10H, 20H, 30H

在这个例子中,ORG 1000H 规定了后续数据从地址 1000H 开始存放。DB 指令定义了三个字节的数据,分别是 10H、20H 和 30H。存储情况如下:

地址 1000H 存储 10H;

地址 1001H 存储 20H;

地址 1002H 存储 30H。

定义字符数据

XML 复制代码
ORG 2000H
STRING: DB 'HELLO'

这里定义了一个字符串 "HELLO"。每个字符会以其对应的 ASCII 码值存放在存储器中。存储情况如下:

地址 2000H 存储字符 H 的 ASCII 码值 48H;

地址 2001H 存储字符 E 的 ASCII 码值 45H;

地址 2002H 存储字符 L 的 ASCII 码值 4CH;

地址 2003H 存储字符 L 的 ASCII 码值 4CH;

地址 2004H 存储字符 O 的 ASCII 码值 4FH。

定义表达式数据

XML 复制代码
ORG 3000H
VALUES: DB 10+5, 2*8

此例中,DB 指令定义的数据是表达式的值。10+5 的结果是15 (十六进制为 0FH),2 * 8 的结果是16 (十六进制为 10H)。存储情况如下:

地址 3000H 存储 0FH;

地址 3001H 存储 10H。

4、注意事项

① 数据类型:DB 指令定义的数据为字节类型每个表达式的值必须在一个字节(0 - 255)的范围内。

② 存储顺序:数据按照表达式在 DB 指令中出现的顺序依次存储在连续的存储单元中

**③ 标号使用:**如果使用了标号,它可以在程序的其他地方引用,方便对这些数据进行访问。

六、DW 定义数据字节命令

1、功能

DW 的指令全程为"Define Word",即定义字,其作用是在程序存储器里**定义一个或多个16位的字数据。**这些数据可以是常数、地址或者表达式的值,并且会按顺序存于指定的存储单元。

1个数据字要两个存储单元存放时,高位在前,低位在后

2、语法格式

[标号:] DW 表达式1 [, 表达式2, ...]

"标号" 是可选的,它代表 DW 指令所定义的第一个字数据的起始存储地址。

"表达式" 可以是十进制或十六进制的常数地址或者由它们组成的合法表达式,多个表达式之间用逗号分隔。

3、使用示例

定义常数数据

XML 复制代码
ORG 1000H
DATA: DW 1234H, 5678H

此例中,ORG 1000H 让后续数据从地址 1000H 开始存放。**DW 指令定义了两个 16 位的字数据,**存储情况如下:

地址 1000H 存储 1234H 的高字节 12H;

地址 1001H 存储 1234H 的低字节 34H;

地址 1002H 存储 5678H 的高字节 56H;

地址 1003H 存储 5678H 的低字节 78H;

定义地址数据

XML 复制代码
ORG 2000H
ADDR: DW 3000H, 4000H

这里定义了两个地址数据。存储情况如下:

地址 2000H 存储 3000H 的高字节 30H;

地址 2001H 存储 3000H 的低字节 00H;

地址 2002H 存储 4000H 的高字节 40H;

地址 2003H 存储 4000H 的低字节 00H。

定义表达式数据

XML 复制代码
ORG 3000H
VALUES: DW 1000 + 2000, 3000 * 2

在这个例子中,DW 指令定义的数据是表达式的值。1000 + 2000 结果为 3000 (十六进制 0BB8H),3000 * 2 结果为 6000 (十六进制 1770H)。存储情况如下:

地址 3000H 存储 0BB8H 的高字节 0BH;

地址 3001H 存储 0BB8H 的低字节 B8H;

地址 3002H 存储 1770H 的高字节 17H;

地址 3003H 存储 1770H 的低字节 70H。

4、注意事项

**① 数据类型:**DW 指令定义的是 16 位的字数据,每个表达式的值要在 16 位(0 - 65535)的范围内。

**② 存储顺序:**每个 16 位数据的高字节存于低地址单元,低字节存于高地址单元。

**③ 标号使用:**若使用了标号,可在程序其他地方引用,便于对这些数据进行访问。

七、DS 定义存储区命令

1、功能

DS 指令的全称为 "Define Storage",也就是定义存储空间。

它的主要作用是在程序存储器中预留出指定数量的连续存储单元这些预留的存储单元不会被赋予具体的数据值,只是作为空白区域等待后续程序使用,比如用于存储临时数据、数组等。

2、语法格式

[标号:] DS 表达式

"标号" 是可选的,它表示预留存储空间的起始地址。如果使用了标号,在后续程序中可以通过该标号来引用这个预留空间。

"表达式" 是一个数值,代表要预留的存储单元的数量。这个表达式可以是一个具体的常数, 也可以是一个**合法的计算表达式,**其计算结果必须是一个正整数。

3、使用示例

预留固定数量的存储单元

XML 复制代码
ORG 1000H
BUFFER: DS 10

在这个例子中,ORG 1000H 规定了后续操作从地址 1000H 开始。

DS 10 表示从地址 1000H 开始预留 10 个连续的存储单元。也就是说,地址范围从 1000H 到 1009H 的这 10 个存储单元被预留出来,后续程序可以使用这些单元来存储数据。

这里的 BUFFER 标号代表预留空间的起始地址 1000H

结合表达式预留存储单元

XML 复制代码
ORG 2000H
TEMP: DS 5 + 3

此例中,DS 5 + 3 先计算表达式 5 + 3 的值为 8,所以从地址 2000H 开始预留 8 个连续的存储单元,地址范围是从 2000H 到 2007H。

这里的 TEMP 标号代表预留空间的起始地址为2000H

4、注意事项

**① 存储单元的用途:**使用 DS 指令预留的存储单元在汇编时不会被初始化,其初始值是不确定的。在使用这些预留单元之前,通常需要在程序中对其进行初始化操作。

**② 地址连续性:**预留的存储单元是连续的,在程序设计时要确保后续对这些单元的使用不会超出预留的范围,避免出现数据覆盖或越界访问的问题。

**③ 与其他指令的区别:**要注意 DS 指令和 DB、DW 指令的区别。DB 和 DW 指令是用于定义具体的数据并存储在存储器中,而 DS 指令只是预留空间,不存储具体数据。

以上即为 51单片机的汇编伪指令 的全部内容,创作不易,麻烦三连支持一下呗~

相关推荐
南泽兆3 小时前
MCU选型的五大维度--助力嵌入式产品设计
单片机·嵌入式硬件
LS_learner6 小时前
ESP32S3 链接到 WiFi
嵌入式硬件
kyle~7 小时前
嵌入式---电机分类
嵌入式硬件
cccc卌8 小时前
MCU如何查看系统有没有卡死
单片机·嵌入式硬件
xMathematics9 小时前
STM32嵌入式开发从入门到实战:全面指南与项目实践
stm32·单片机·嵌入式硬件
SundayBear9 小时前
嵌入式MCU常用模块
单片机·嵌入式硬件·常用模块
冻结的鱼10 小时前
在 STM32 中实现电机测速的方法介绍
stm32·单片机·嵌入式硬件
getapi10 小时前
51单片机烧录程序演示教程
stm32·单片机·51单片机
六六六六六666614 小时前
STM32中Hz和时间的转换
stm32·单片机·嵌入式硬件
飞凌嵌入式17 小时前
飞凌嵌入式T527核心板正式发布OpenHarmony4.1系统,实现从芯片架构到操作系统的全链路国产化
人工智能·嵌入式硬件·嵌入式·飞凌嵌入式