2016-08-17 57 views
0

我正在做一个简单的程序,它在传入传输时读取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 (或别的东西)..但那并没有发生。

我错过了什么?或者我做错了方向?

+0

我不知道8051,但它是一个快速的谷歌,它如何记忆体映射寄存器告诉我,[他们是银行](http ://what-when-how.com/8051-microcontroller/8051-register-banks-and-stack/)。你确定你的代码正在使用寄存器组0吗?如果没有,'R0'不会映射到地址'0x00' –

+0

这是存储过程,我很确定我使用的是默认银行 – RedSmolf

+0

那么,修改'R0'时哪个地址会改变值?You co使用调试器来检查它是否正确?虽然,重新阅读您的问题,但我不得不猜测默认行为不是将您的数据段与寄存器组重叠。你可以使用调试器来查看访问'RX_Message'的指令实际使用的地址吗?即找出链接后发生了什么? –

回答

0

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