用 DS 语句定义的数据

Data defined with DS statement

我正在做一个简单的程序,它在传入的传输中读取 UART 缓冲区 (S0BUF),然后在我按下按钮时通过 UART 将其传回。 我使用的是 Nordic Semiconductor nRF24LE1 芯片。

我让它与 C 一起工作,当我使用 R0-R7 寄存器之一时我让它工作。 我想做的是使用可重定位字节而不是普通的 R 寄存器。

这是一段有效的代码。

UART_ISR: ; (Store incoming transmission in R0)
        JNB    RI0,    UART_ISR_A
        MOV    R0,     S0BUF
        SETB   P00
        CLR    RI0
        JMP    UART_ISR_END
UART_ISR_A:
        SETB   P01
        CLR    TI0
UART_ISR_END:           
        RETI


Main:
        MOV    A,       P2
        XRL    A,       #0x0FE
        JZ     Main_Case_A
        XRL    A,       #(0x0FE XOR 0x0FD)
        JZ     Main_Case_B
        ...

Main_Case_A:
        MOV    S0BUF,   R0
        SJMP   Main

但如果我进行以下更改(标记为 <--- THIS),它将不起作用。我知道我在这段代码中遗漏了一些片段和内容,但我不想要很多行。

?DT?Data    segment     data                 ; <--- THIS

rseg     ?DT?Data                            ; <--- THIS
         RX_Message:    ds    1              ; <--- THIS

UART_ISR: ; (Store incoming transmission in R0)
            JNB    RI0,    UART_ISR_A
            MOV    RX_Message,     S0BUF        ; <-- THIS
            SETB   P00
            CLR    RI0
            JMP    UART_ISR_END
UART_ISR_A:
            SETB   P01
            CLR    TI0
UART_ISR_END:           
            RETI


Main:
        MOV    A,       P2
        XRL    A,       #0x0FE
        JZ     Main_Case_A
        XRL    A,       #(0x0FE XOR 0x0FD)
        JZ     Main_Case_B
        ...

Main_Case_A:
        MOV    S0BUF,   RX_Message     ;      <--- AND THIS
        SJMP   Main

它在没有警告或错误的情况下组装所有内容,但结果不一样。

我想要的是让 assembler/linker 决定在内存中放置我的 RX_Message 字节的位置。 如果我查看列表文件,我可以看到它已将它分配给地址 0x00,这对我来说很好,因为我没有在任何地方使用 R0。但是我假设如果我在某个地方使用 R0,它会设置我的 RX_Message地址到 0x01(或其他地址).. 但那没有发生。

我错过了什么?还是我做错了?

解决办法.. 堆栈当然涉及,因为我正在使用中断(没有提到因为我认为这不重要..添加一些代码来重新定位堆栈解决了这个问题。虽然我希望链接器不会有将我的 RX_Message 标签放在堆栈默认地址上..