用 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 标签放在堆栈默认地址上..
我正在做一个简单的程序,它在传入的传输中读取 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 标签放在堆栈默认地址上..