目录
[一、ORG 汇编起始地址命令](#一、ORG 汇编起始地址命令)
[二、END 汇编终止命令](#二、END 汇编终止命令)
[三、EQU 赋值命令](#三、EQU 赋值命令)
[四、BIT 位定义命令](#四、BIT 位定义命令)
[五、DB 定义数据字节命令](#五、DB 定义数据字节命令)
[六、DW 定义数据字节命令](#六、DW 定义数据字节命令)
[七、DS 定义存储区命令](#七、DS 定义存储区命令)
在 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单片机的汇编伪指令 的全部内容,创作不易,麻烦三连支持一下呗~
