久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2398|回復: 17
打印 上一主題 下一主題
收起左側

請問關于單片機C語言尋址方式與匯編語言棧的問題

[復制鏈接]
跳轉到指定樓層
樓主
一:請問一下c語言尋址方式有幾種,以怎樣的語句流程實現以下的需求的
1:  80H地址 = FFEFH地址的值+P1端口的值       80H=FFEFH+P1         用c語言如何表達



2:  80H地址 =變量 A的值+P1端口的值
         80H = A+P1           用c語言如何表達

3: 80H地址 =變量 A的值+0x35
         80H = A+0x35        用c語言如何表達

4: 80H地址 =數字0x35+數字0x35
       80H =0x35+0x35      用c語言如何表達

二:請問關于“用棧傳遞參數”這個詞語。我寫匯編程序的時候,也嘗試用 push  pop給地址賦值,但是用mov指令也可以達到
       將80h的值賦給81h    mov 81h,80h        
                               push 81h
                               push 80h
                               pop 81h
                               pop 80h         還是棧傳遞參數比mov指令有特殊的意義
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:883242 發表于 2023-4-11 20:55 | 只看該作者
1)前面4個問題你沒有說明80H位于哪個空間?是idata、pdata還是xdata,所以無法回答。

2)堆棧傳遞函數是標準c語言的做法,但是c51不是標準c語言,8051這個內核太弱了用標準c語言實現過于浪費資源,所以你的問題無意義。
回復

使用道具 舉報

板凳
ID:69038 發表于 2023-4-11 21:34 | 只看該作者
我記得用MOV會改變C和DC位,而PUSH、POP則不會。
回復

使用道具 舉報

地板
ID:883242 發表于 2023-4-12 01:13 | 只看該作者
zhuls 發表于 2023-4-11 21:34
我記得用MOV會改變C和DC位,而PUSH、POP則不會。

通過ACC的MOV當然會改變PSW標志位,然而mov 81h,80h這個不通過ACC的指令???
注:mov 81h,80h這句話也是錯的,指令本身沒問題,后面的兩個操作數大于7fh在邏輯上錯了。
回復

使用道具 舉報

5#
ID:73992 發表于 2023-4-12 07:06 來自手機 | 只看該作者
Hephaestus 發表于 2023-4-11 20:55
1)前面4個問題你沒有說明80H位于哪個空間?是idata、pdata還是xdata,所以無法回答。

2)堆棧傳遞函數 ...

80h是指用@R0,或者@R1 訪問的那個128字節地址
回復

使用道具 舉報

6#
ID:69038 發表于 2023-4-12 08:46 | 只看該作者
Hephaestus 發表于 2023-4-12 01:13
通過ACC的MOV當然會改變PSW標志位,然而mov 81h,80h這個不通過ACC的指令???
注:mov 81h,80h這句話也 ...

不是很懂畢竟沒有系統地學過,就是在翻書時看到的
回復

使用道具 舉報

7#
ID:624769 發表于 2023-4-12 16:23 | 只看該作者
你的問題,必須匯編 和 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
這個最終結果和通過堆棧 交換數據的結果是一樣的。效率也要高一點,所以,用堆棧交換數據,實際沒有太大的意義。
回復

使用道具 舉報

8#
ID:73992 發表于 2023-4-12 17:13 | 只看該作者
188610329 發表于 2023-4-12 16:23
你的問題,必須匯編 和 C 都懂得才能回答,但是,你的描述,又非常的不確切,讓人無從切入,不如你先把你一 ...

第一個問題,是想知道c語言對 80h地址 片外地址 端口p1  變量 的值 立即數 的語句流程
1:MOV
      MOV DPTR,#FFEFH
     MOV A,@DPTR
     
     
回復

使用道具 舉報

9#
ID:883242 發表于 2023-4-12 17:19 | 只看該作者
lyonkon 發表于 2023-4-12 07:06
80h是指用@R0,或者@R1 訪問的那個128字節地址

那你聲明變量的時候加個idata修飾就可以了,指定80h地址毫無意義。
回復

使用道具 舉報

10#
ID:73992 發表于 2023-4-12 17:25 | 只看該作者
188610329 發表于 2023-4-12 16:23
你的問題,必須匯編 和 C 都懂得才能回答,但是,你的描述,又非常的不確切,讓人無從切入,不如你先把你一 ...

1:MOV R0,#80H
  MOV DPTR,#FFEFH
   MOV A,@DPTR
   ADD A,P1
   MOV @R0,A
我主要想知道,c語言片內,片外,尋址語句方式流程。并且運算的時候是不是先將地址中的值取到變量再計算。
回復

使用道具 舉報

11#
ID:883242 發表于 2023-4-12 17:38 | 只看該作者
lyonkon 發表于 2023-4-12 17:25
1:MOV R0,#80H
  MOV DPTR,#FFEFH
   MOV A,@DPTR

片內0~7fh是data(可以不寫),80h以上要加idata修飾,片外用pdata或者xdata修飾,如果你真的懂了匯編應該能馬上理解pdata和xdata的區別。
回復

使用道具 舉報

12#
ID:624769 發表于 2023-4-12 20:35 | 只看該作者
lyonkon 發表于 2023-4-12 17:25
1:MOV R0,#80H
  MOV DPTR,#FFEFH
   MOV A,@DPTR

方法一:
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語言學習的深入,自己會有決斷。
回復

使用道具 舉報

13#
ID:73992 發表于 2023-4-12 21:26 | 只看該作者
188610329 發表于 2023-4-12 20:35
方法一:
unsigned char idata *pd;
unsigned char xdata *px;

依據您的例程,以下是我理解。c語言的尋址方式是通過聲明地址變量,進行間接尋址。類似與@RI,和@dptr。  *pd = *px + P1;可以以間接尋址的形式,參與運算表達式。
非常感謝您的解答,我應該理解了。
回復

使用道具 舉報

14#
ID:1065084 發表于 2023-4-13 09:21 | 只看該作者
lyonkon 發表于 2023-4-12 21:26
依據您的例程,以下是我理解。c語言的尋址方式是通過聲明地址變量,進行間接尋址。類似與@RI,和@dptr。  ...

匯編語言直接對應機器碼,機器碼的重點是針對不同的機器乃至不同的型號操作都是不同的。

例如你用匯編訪問寄存器,你是以寄存器的實際地址來訪問的,而且就簡單的MOV指令就分為MOV、MOVC、MOVX,在C中是沒有這三種MOV指令的區別,乃至你換到其他架構系統也是直接轉移的,而你的匯編程序要全部重寫一遍。

所謂的高級語言就是通用性更強,適配性更強。比如你用c在51 和32之間轉換使用,只說算法層面不說外設,你只需要把例如int等數據變量重新調整一下。

你強制讓c去訪問固定地址,編程上是可以的,但是沒有意義,因為對于數據來說存無論存儲在20H還是21H都是一樣的,可能你說,不知道地址怎么行,存儲器用滿了怎么辦?編譯器:不用在意我,我會出手。編譯器在編譯時會自動檢測剩余內存和其他資源以及錯誤,所以,不要擔心

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

15#
ID:883242 發表于 2023-4-13 12:18 | 只看該作者
yuxuesuixing 發表于 2023-4-13 09:21
匯編語言直接對應機器碼,機器碼的重點是針對不同的機器乃至不同的型號操作都是不同的。

例如你用匯編 ...

標準c當然不區分,但是C51會區分這三種指令。
MOV對應data(默認,可以不寫),idata和SFR空間
MOVC對應code空間
MOVX對應pdata和xdata空間

高級語言通用性強,但是死忒慘這個螺螄殼里面很難做道場的,所以C51沒有通用性。
回復

使用道具 舉報

16#
ID:73992 發表于 2024-2-20 17:45 | 只看該作者
謝謝各位朋友的解答。
直到現在才有能力描述這個問題,當時是想模仿c語言寫一套通用的命令子程序集,寫程序時候可以隨意調。因為不知道具體需要什么功,就相當于沒找到需求就擱置了。不曾想現在有了需求;


上面這個程序,因為R0,R1,在子程序中要使用,沒有剩下其他寄存器可用 R0,R1,又無法入,將R0,R1先寫入內存 當棧使用妥協辦法。

下面這個程序,將相同功能的程序寫了兩遍,刷兩個固化值。因為只使用一次,所以偷點懶感覺沒有問題。



現在的問題是,調用子程  要傳遞值進去,然后子程序執行完了結果還要留著。目前我是使用以下方法,
使用內存傳遞值。請老師指點一下。




回復

使用道具 舉報

17#
ID:883242 發表于 2024-2-20 18:03 | 只看該作者
R0、R1一共有4組,用register bank區分,可以不需要壓棧保護。樓主從去年就開始搞cortex-M和51匯編,為什么到現在還沒有入門?
回復

使用道具 舉報

18#
ID:73992 發表于 2024-2-20 22:27 | 只看該作者
Hephaestus 發表于 2024-2-20 18:03
R0、R1一共有4組,用register bank區分,可以不需要壓棧保護。樓主從去年就開始搞cortex-M和51匯編,為什么 ...

這樣可以將相同性質的數據放在一個寄存器頁面。謝謝!
一直在調試stm32硬件,過程中匯編程序不復雜。硬件現在調試差不多了。著手寫復雜點程序的時候,發現了問題。程序之間數據傳遞,我一直都是放在指定內存中使用的。我覺得這樣可能不規范,所以想規范一下。相當于匯編語言現在才開始學。
如果是arm內核,里面R0--R15只有一個頁面,程序之間傳遞數據
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产在线播放av | 国产91色在线 | 亚洲 | 免费在线观看一区二区 | 久视频在线观看 | 国产日韩精品久久 | 黄页网址在线观看 | 欧美一级久久 | 精品久久久久久久久久久 | 国产激情网 | 一区二区三区在线免费观看 | 蜜桃臀av一区二区三区 | 日韩精品视频一区二区三区 | 欧美日韩国产在线观看 | 97中文视频 | 人人看人人射 | 丝袜美腿一区二区三区 | 一区二区三区国产好 | 国产精品久久久久久一区二区三区 | 国产精品亚洲成在人线 | 午夜伦4480yy私人影院 | 欧洲成人免费视频 | 欧美精品一二三区 | 国产人成精品一区二区三 | 一区二区三区四区不卡 | 国产成人精品久久二区二区 | 成人av电影在线 | 精品美女久久久久久免费 | 日韩欧美精品一区 | 日韩有码一区 | 日本视频在线播放 | 成人免费视频在线观看 | 成人免费看黄 | 香蕉久久av | 国产精品久久久久久久久久久久冷 | 欧美一区二区三区在线观看视频 | 91av在线电影 | 国产成人99久久亚洲综合精品 | 国产精品欧美精品 | 一区二区三区视频在线观看 | 日韩中文字幕免费在线观看 | 99精品在线观看 |