我正在做一个简单的程序,它在传入传输时读取UART缓冲区(S0BUF),然后在按下按钮时通过UART传输回来。 我正在使用北欧半导体nRF24LE1芯片。使用DS语句定义的数据
我得到它与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
但是,如果我做了以下修改(标记为< ---这)它不会工作。我知道我错过了这段代码中的一些细分和东西,但我不想多行。
?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 (或别的东西)..但那并没有发生。
我错过了什么?或者我做错了方向?
我不知道8051,但它是一个快速的谷歌,它如何记忆体映射寄存器告诉我,[他们是银行](http ://what-when-how.com/8051-microcontroller/8051-register-banks-and-stack/)。你确定你的代码正在使用寄存器组0吗?如果没有,'R0'不会映射到地址'0x00' –
这是存储过程,我很确定我使用的是默认银行 – RedSmolf
那么,修改'R0'时哪个地址会改变值?You co使用调试器来检查它是否正确?虽然,重新阅读您的问题,但我不得不猜测默认行为不是将您的数据段与寄存器组重叠。你可以使用调试器来查看访问'RX_Message'的指令实际使用的地址吗?即找出链接后发生了什么? –