51单片机的汇编伪指令

打印 上一主题 下一主题

主题 1819|帖子 1819|积分 5457

目次
一、ORG 汇编起始地址命令
1、功能
2、语法格式
3、利用示例
4、留意事项
二、END 汇编终止命令
1、功能
2、语法格式
3、利用示例
4、留意事项
三、EQU 赋值命令
1、功能
2、语法格式
3、利用示例
4、留意事项
四、BIT 位定义命令
1、功能
2、语法格式
3、利用示例
4、留意事项
五、DB 定义数据字节命令
1、功能
2、语法格式
3、利用示例
4、留意事项
六、DW  定义数据字节命令
1、功能
2、语法格式
3、利用示例
4、留意事项
七、DS 定义存储区命令
1、功能
2、语法格式
3、利用示例
4、留意事项

        在 51 单片机的汇编语言编程中,伪指令起着告急的作用。
        伪指令并非真正的指令,不会生成呆板码,不像真正的指令那样在程序运行时被执行。而是在汇编过程中,被汇编程序用来指导汇编工作的举行
        下面将详细介绍一些常用的 51 单片机汇编伪指令。
一、ORG 汇编起始地址命令

1、功能

        ORG 指令的作用是规定后续程序数据块在存储器里起始地址。在汇编时,汇编程序会依据 ORG 指令所指定的地址,将程序和数据存于对应的存储单元。
        如果不利用ORG,则汇编得到的目标程序将从0000H地址开始。
2、语法格式

   ORG 表达式
          这里的“表达式”是一个16位的地址值,可以或许是详细的数值,也可以是已经定义的符号地址
3、利用示例

  1. ORG 0000H
  2.     LJMP MAIN     ; 跳转到主程序
  3. ORG 0030H
  4. MAIN:
  5.     MOV SP, #60H  ; 设置堆栈指针
  6.     ; 主程序代码
  7.     SJMP $        ; 程序暂停
  8. 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、利用示例

  1. ORG 0000H
  2.     LJMP MAIN     ; 跳转到主程序
  3. ORG 0030H
  4. MAIN:
  5.     MOV SP, #60H  ; 设置堆栈指针
  6.     ; 主程序代码
  7.     SJMP $        ; 程序暂停
  8. 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、利用示例

① 数值常量定义符号名
  1. COUNT EQU 10
  2. ORG 0000H
  3. START:
  4.     MOV R0, #COUNT ; 将COUNT的值10传送到寄存器R0
  5.     ; 其他代码
  6.     SJMP $
  7. END
复制代码
        在这个例子中,COUNT 被 EQU 定义为 10,在后续代码里,MOV R0, #COUNT 就相称于 MOV R0, #10,这使得代码的含义更加清晰。
② 地址常量定义符号名
  1. DATA_ADDR EQU 30H
  2. ORG 0000H
  3. START:
  4.     MOV A, DATA_ADDR ; 将地址30H中的内容传送到累加器A
  5.     ; 其他代码
  6.     SJMP $
  7. END
复制代码
        这里,DATA_ADDR 被定义为地址 30H,在程序里利用 DATA_ADDR 就等同于利用 30H。
③ 寄存器定义符号名
  1. TEMP EQU R1
  2. ORG 0000H
  3. START:
  4.     MOV TEMP, #20H ; 将立即数20H传送到寄存器R1
  5.     ; 其他代码
  6.     SJMP $
  7. END
复制代码
        在这个示例中,TEMP 被定义为寄存器 R1,利用 TEMP 就相称于利用 R1。
4、留意事项

        ① 不可重复定义:利用 EQU 定义的符号名在整个程序中不能被重新定义。如果实验重新定义,汇编程序会报错。
        ② 先定义后利用:必须先利用 EQU 定义符号名,然后才能在程序中利用该符号名。如果在定义之前就利用,汇编程序无法识别该符号名。
四、BIT 位定义命令

1、功能

        BIT 指令的重要功能是为一个位地址赋予一个符号名类似于C语言中的宏定义常量。
        在 51 单片机里,存在可位寻址的地区,通过 BIT 指令可以利用自定义的符号名来表现这些位地址,这样能增强程序的可读性和可维护性,让程序员在编写程序时可以利用更具含义的符号来操纵位。
2、语法格式

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

 为直接位地址定义符号名
  1. FLAG BIT 20H.0
  2. ORG 0000H
  3. START:
  4.     SETB FLAG ; 将位地址20H.0置1
  5.     ; 其他代码
  6.     SJMP $
  7. END
复制代码
        在这个例子中,FLAG 被 BIT 指令定义为位地址 20H.0。在后续的程序中,SETB FLAG 就相称于 SETB 20H.0,将位地址 20H.0 置为 1。
 为寄存器的位定义符号名
  1. CY_FLAG BIT PSW.7
  2. ORG 0000H
  3. START:
  4.     MOV A, #0FFH
  5.     ADD A, #1 ; 执行加法操作,产生进位
  6.     JB CY_FLAG, OVERFLOW ; 如果进位标志位PSW.7为1,跳转到OVERFLOW处
  7.     ; 其他代码
  8.     SJMP $
  9. OVERFLOW:
  10.     ; 处理溢出情况
  11.     SJMP $
  12. 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、利用示例

定义常数数据
  1. ORG 1000H
  2. DATA: DB 10H, 20H, 30H
复制代码
        在这个例子中,ORG 1000H 规定了后续数据从地址 1000H 开始存放。DB 指令定义了三个字节的数据,分别是 10H、20H 和 30H。存储情况如下:
        地址 1000H 存储 10H;
        地址 1001H 存储 20H;
        地址 1002H 存储 30H。
 定义字符数据
  1. ORG 2000H
  2. 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。
定义表达式数据
  1. ORG 3000H
  2. 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、利用示例

 定义常数数据
  1. ORG 1000H
  2. DATA: DW 1234H, 5678H
复制代码
        此例中,ORG 1000H 让后续数据从地址 1000H 开始存放。DW 指令定义了两个 16 位的字数据,存储情况如下:
        地址 1000H 存储 1234H 的高字节 12H;
        地址 1001H 存储 1234H 的低字节 34H;
        地址 1002H 存储 5678H 的高字节 56H;
        地址 1003H 存储 5678H 的低字节 78H;
 定义地址数据
  1. ORG 2000H
  2. ADDR: DW 3000H, 4000H
复制代码
        这里定义了两个地址数据。存储情况如下:
        地址 2000H 存储 3000H 的高字节 30H;
        地址 2001H 存储 3000H 的低字节 00H;
        地址 2002H 存储 4000H 的高字节 40H;
        地址 2003H 存储 4000H 的低字节 00H。
定义表达式数据
  1. ORG 3000H
  2. 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、利用示例

 预留固定命目的存储单元
  1. ORG 1000H
  2. BUFFER: DS 10
复制代码
        在这个例子中,ORG 1000H 规定了后续操纵从地址 1000H 开始。
        DS 10 表现从地址 1000H 开始预留 10 个连续的存储单元。也就是说,地址范围从 1000H 到 1009H 的这 10 个存储单元被预留出来,后续程序可以利用这些单元来存储数据。
        这里的 BUFFER 标号代表预留空间的起始地址 1000H
结合表达式预留存储单元
  1. ORG 2000H
  2. 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单片机的汇编伪指令 的全部内容,创作不易,贫苦三连支持一下呗~  


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

北冰洋以北

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表