2016-08-17 58 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標籤放在堆棧的默認地址上。