|
發布時間: 2023-4-11 20:11
正文摘要:一:請問一下c語言尋址方式有幾種,以怎樣的語句流程實現以下的需求的 1: 80H地址 = FFEFH地址的值+P1端口的值 80H=FFEFH+P1 用c語 ... |
Hephaestus 發表于 2024-2-20 18:03 這樣可以將相同性質的數據放在一個寄存器頁面。謝謝!一直在調試stm32硬件,過程中匯編程序不復雜。硬件現在調試差不多了。著手寫復雜點程序的時候,發現了問題。程序之間數據傳遞,我一直都是放在指定內存中使用的。我覺得這樣可能不規范,所以想規范一下。相當于匯編語言現在才開始學。 如果是arm內核,里面R0--R15只有一個頁面,程序之間傳遞數據 |
| R0、R1一共有4組,用register bank區分,可以不需要壓棧保護。樓主從去年就開始搞cortex-M和51匯編,為什么到現在還沒有入門? |
yuxuesuixing 發表于 2023-4-13 09:21 標準c當然不區分,但是C51會區分這三種指令。 MOV對應data(默認,可以不寫),idata和SFR空間 MOVC對應code空間 MOVX對應pdata和xdata空間 高級語言通用性強,但是死忒慘這個螺螄殼里面很難做道場的,所以C51沒有通用性。 |
lyonkon 發表于 2023-4-12 21:26 匯編語言直接對應機器碼,機器碼的重點是針對不同的機器乃至不同的型號操作都是不同的。 例如你用匯編訪問寄存器,你是以寄存器的實際地址來訪問的,而且就簡單的MOV指令就分為MOV、MOVC、MOVX,在C中是沒有這三種MOV指令的區別,乃至你換到其他架構系統也是直接轉移的,而你的匯編程序要全部重寫一遍。 所謂的高級語言就是通用性更強,適配性更強。比如你用c在51 和32之間轉換使用,只說算法層面不說外設,你只需要把例如int等數據變量重新調整一下。 你強制讓c去訪問固定地址,編程上是可以的,但是沒有意義,因為對于數據來說存無論存儲在20H還是21H都是一樣的,可能你說,不知道地址怎么行,存儲器用滿了怎么辦?編譯器:不用在意我,我會出手。編譯器在編譯時會自動檢測剩余內存和其他資源以及錯誤,所以,不要擔心 |
188610329 發表于 2023-4-12 20:35 依據您的例程,以下是我理解。c語言的尋址方式是通過聲明地址變量,進行間接尋址。類似與@RI,和@dptr。 *pd = *px + P1;可以以間接尋址的形式,參與運算表達式。 非常感謝您的解答,我應該理解了。 |
lyonkon 發表于 2023-4-12 17:25 方法一: unsigned char idata *pd; unsigned char xdata *px; pd = 0x80; px = 0xffef; *pd = *px + P1; 方法二: unsigned char idata temp1 _at_ 0x80; unsigned char xdata temp2 _at_ 0xffef; temp1 = temp2 + P1; 方法三: *((unsigned char idata *)0x80) = *((unsigned char xdata *)0xffef) + P1; 以上三個方法,均可達到你匯編代碼的目的,至于到底該用哪種方法,隨著你C語言學習的深入,自己會有決斷。 |
lyonkon 發表于 2023-4-12 17:25 片內0~7fh是data(可以不寫),80h以上要加idata修飾,片外用pdata或者xdata修飾,如果你真的懂了匯編應該能馬上理解pdata和xdata的區別。 |
188610329 發表于 2023-4-12 16:23 1:MOV R0,#80H MOV DPTR,#FFEFH MOV A,@DPTR ADD A,P1 MOV @R0,A 我主要想知道,c語言片內,片外,尋址語句方式流程。并且運算的時候是不是先將地址中的值取到變量再計算。 |
lyonkon 發表于 2023-4-12 07:06 那你聲明變量的時候加個idata修飾就可以了,指定80h地址毫無意義。 |
188610329 發表于 2023-4-12 16:23 第一個問題,是想知道c語言對 80h地址 片外地址 端口p1 變量 的值 立即數 的語句流程 1:MOV MOV DPTR,#FFEFH MOV A,@DPTR |
|
你的問題,必須匯編 和 C 都懂得才能回答,但是,你的描述,又非常的不確切,讓人無從切入,不如你先把你一 當中的問題用匯編表述出來,然后,再跟你講 C 里面如果實現吧。 先回答你 二的問題。 MOV 81H,80H 是把 81H地址的值 賦值到 80H地址, 最終的結果,是81H 和 80H 地址的 內容 完全相等。 而, PUSH 81H PUSH 80H POP 81H POP 80H 是把 81H 和 80H 兩個地址的 內容互相交換,最終 81H 地址的內容 為原 80H地址的內容,而80H 地址的內容為原81地址的內容,要達到這個目的,不使用堆棧的話,不能簡單地用MOV 要用如下指令: XCH A,80H XCH A,81H XCH A,80H 這個最終結果和通過堆棧 交換數據的結果是一樣的。效率也要高一點,所以,用堆棧交換數據,實際沒有太大的意義。 |
Hephaestus 發表于 2023-4-12 01:13 不是很懂畢竟沒有系統地學過,就是在翻書時看到的 ![]() |
Hephaestus 發表于 2023-4-11 20:55 80h是指用@R0,或者@R1 訪問的那個128字節地址 |
zhuls 發表于 2023-4-11 21:34 通過ACC的MOV當然會改變PSW標志位,然而mov 81h,80h這個不通過ACC的指令??? 注:mov 81h,80h這句話也是錯的,指令本身沒問題,后面的兩個操作數大于7fh在邏輯上錯了。 |
| 我記得用MOV會改變C和DC位,而PUSH、POP則不會。 |
|
1)前面4個問題你沒有說明80H位于哪個空間?是idata、pdata還是xdata,所以無法回答。 2)堆棧傳遞函數是標準c語言的做法,但是c51不是標準c語言,8051這個內核太弱了用標準c語言實現過于浪費資源,所以你的問題無意義。 |