• 基于Keil a51汇编 —— 控制语句


    ALIGN

    ALIGN expression
    ALIGN 语句将位置计数器设置为下一个地址模 2^表达式。 这可用于确保下一条语句在 2^n 边界上对齐。例如,对齐缓存行中的代码或数据。如有必要,汇编程序会创建一个间隙。间隔字节的内容因各个部分而异:

    • data中未定义。
    • const中的0。
    • code中的 NOP。

    该段需要至少使用与 ALIGN 语句中使用的对齐方式相同的对齐方式进行声明。

    Example MYDATA: SEGMENT EDATA ALIGN(6)
            RSEG    MYDATA
    var1:   DSB     1
            ALIGN   5       ; align to 32 byte boundary
    var2:   DSW     1
    
    • 1
    • 2
    • 3
    • 4
    • 5

    ORG

    ORG expression
    ORG 语句更改当前段的位置计数器,并为后续语句设置新的原点。表达式必须是没有前向引用的简单可重定位表达式。只能使用当前段中的绝对地址或符号值。表达式中可以使用美元符号字符 (‘$’),表示位置计数器的当前值。

    遇到 ORG 语句时,汇编程序将计算表达式的值并更改位置计数器。

    • 如果 ORG 语句出现在绝对段中,则会为位置计数器分配指定的绝对地址值。位置计数器不能设置为低于分段基址的地址。
    • 如果 ORG 语句出现在可重定位段中,则会为位置计数器分配指定表达式的偏移量。例如,如果可重定位段从地址 1000h 开始,并且 ORG表达式的值为 1234h,则下一条语句的绝对地址为 2234h (1000h + 1234h)。

    ORG 语句更改位置计数器,这可能会产生间隙,但不会创建新段。

    注意:

    • 可以使用 ORG语句更改位置计数器并覆盖(或覆盖)现有代码或数据。之所以支持此功能,是因为旧程序使用此技术在同一物理地址上定义多个变量。如果以这种方式使用ORG 语句,则不会生成警告。
    ORG     100h
    ORG     RESTART
    ORG     EXIT1
    ORG     ($ + 15) AND 0FFF0h
    
    • 1
    • 2
    • 3
    • 4

    RSEG

    RSEG segment
    RSEG 语句选择以前使用 SEGMENT 语句声明的可重定位段。

    MYPROG  SEGMENT CODE     ; Declare the segment
            RSEG    MYPROG   ; Select the segment
    
    • 1
    • 2

    CSEG

    CSEG 〚AT address〛
    CSEG 语句在 CODE 空间中选择一个绝对段。

    如果包含可选地址,则汇编程序将从该地址启动绝对段。有效地址范围为 0000h-0FFFFh。

    如果省略可选地址,汇编程序将从地址 0 开始绝对段(如果未定义先前的绝对 CODE 段)。如果先前定义了绝对 CODE 段,则汇编程序将从该段的末尾继续。

    注意:

    • 起始地址必须是绝对表达式。
    • AX51 汇编程序将 CSEG 语句转换为以下内容
    ?CO?modulename?n SEGMENT OFFS address
    
    • 1

    USING

    USING expression
    USING 语句指定使用哪个寄存器bank(0-3) 对 AR0-AR7 寄存器进行编码。选定的寄存器bank在目标文件中记录,内存区域由链接器保留。

    一些 8051指令(如 PUSH 和 POP)只允许使用绝对地址。汇编器将绝对寄存器(AR0-AR7)替换为当前寄存器bank中寄存器的物理地址。当指令 PUSH R0 无效时,PUSH AR0 有效。但是,汇编程序必须知道使用哪个寄存器bank来计算正确的物理地址。这就是 USING 语句的目的。

    USING 语句不会生成任何代码来切换当前寄存器bank。汇编程序必须选择正确的寄存器库。例如,以下代码选择注册bank2:

    PUSH    PSW               ; save the current register bank
    MOV     PSW, #(2 SHL 3)   ;    set register bank 2
    .
    .
    .
    POP     PSW               ; restore saved register bank
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    物理地址的计算方法如下:

    (register bank × 8) + register
    
    • 1

    注意:

    • 请仔细使用 EQU 语句定义绝对寄存器 (AR0-AR7) 的符号。符号值在定义时计算(而不是使用时)。如果随后使用 USING
      语句更改了寄存器库,则定义的符号将具有不正确的地址,并且生成的代码可能会失败。
    USING   3     ; select register bank 3
    PUSH    AR2   ; push R2 in bank 3 (address 1Ah)
    
    USING   1     ; select register bank 1
    PUSH    AR7   ; push R7 in bank 1 (address 1Fh)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    _ERROR_

    _ERROR_ text
    __ERROR__语句使用指定的文本生成错误消息。

    IF VARLEN > 10
      __ERROR__ "Variable Length is Too Long"
    ENDIF
    
    • 1
    • 2
    • 3

    _WARNING_

    _WARNING_ text
    __WARNING__语句使用指定的文本生成警告消息。

    IF VARLEN > 10
      __WARNING__ "Variable Length is Too Long"
    ENDIF
    
    • 1
    • 2
    • 3

    CODE

    symbol CODE address
    CODE 语句将address(在 0000h-0FFFFh 范围内)分配给指定的symbol 。不能重新定义symbol 。

    CO_START   CODE    00000h
    CO_END     CODE    0FFFFh
    
    IVECT_0    CODE    00003h
    IVECT_1    CODE    0000Bh
    IVECT_2    CODE    00013h
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  • 相关阅读:
    循环结构:for循环,while循环,do-while,死循环
    Clickhouse:clickhouse切换目录
    navicat的触发器如何解决
    Web后端开发-总结
    Llama2 论文中译版——开放式基础和微调聊天模型
    docker镜像的创建-Dockerfile
    学术 | [LaTex]超详细Texlive2022+Tex Studio下载安装配置
    数据问题排查思路
    No version of NDK matched the requested version xxx 问题解决
    法国巴黎索邦大学博士后—实验物理学
  • 原文地址:https://blog.csdn.net/elvis02/article/details/133747480