我正在做一個簡單的程序,它在傳入傳輸時讀取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'的指令實際使用的地址嗎?即找出鏈接後發生了什麼? –