使用DS语句

时间:2016-08-17 15:12:18

标签: assembly 8051

我正在做一个简单的程序,它在传入的传输上读取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

它汇总了所有内容而没有任何警告或错误,但结果却不一样。

我想要的是让汇编器/链接器决定在哪里放置我的RX_Message字节。 如果我查看列表文件,我可以看到它将它分配给地址0x00,这对我来说很好,因为我没有在任何地方使用R0 ..但我假设如果我在某处使用R0,它会将我的RX_Message地址设置为0x01(或其他东西)......但这并没有发生。

我错过了什么?或者我做错了吗?

1 个答案:

答案 0 :(得分:0)

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