找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

帖子
查看: 1528|回復(fù): 10
打印 上一主題 下一主題
收起左側(cè)

問一個C語言匯編 之間互相調(diào)用的問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:624769 發(fā)表于 2021-11-12 22:44 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
在 C 語言中,如果聲明一個變量,
unsigned char ABC;
在匯編中 可以用
extrn DATA(ABC)
來調(diào)用,

那么,C 語言中一個define  如:
#define MainForse  24000000L
在匯編中應(yīng)該怎么調(diào)用?

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:883242 發(fā)表于 2021-11-13 00:02 | 只看該作者
沒可能實現(xiàn)。#define是在預(yù)處理階段把MainForse直接簡單替換成24000000L,MainForse這個名字都不可能出現(xiàn)在obj文件里面,更別說讓linker找到跟asm編譯出來的obj連接在一起了。
回復(fù)

使用道具 舉報

板凳
ID:401564 發(fā)表于 2021-11-13 00:25 | 只看該作者
#define MainForse  24000000L
這個只是文本上替換而已,不會被編譯的
而且,#define 是可以在匯編環(huán)境下使用的,但是匯編幾乎每個指令都是地址有有關(guān),#define還不如EQU實用,所以,一般的匯編是不用#define的
當(dāng)然,我見過一些由C轉(zhuǎn)匯編的人喜歡用#define
回復(fù)

使用道具 舉報

地板
ID:624769 發(fā)表于 2021-11-13 01:30 | 只看該作者
Y_G_G 發(fā)表于 2021-11-13 00:25
#define MainForse  24000000L
這個只是文本上替換而已,不會被編譯的
而且,#define 是可以在匯編環(huán)境下使 ...

那么假定 我在  匯編里  
MainForse    EQU    24000D

在 C 里面有辦法調(diào)用么?
現(xiàn)在主要問題是,在混合編寫的時候,有些設(shè)定,兩頭都設(shè)定,在修改時,容易出現(xiàn)錯漏,所以希望能有可以兩邊都引用的方法。
回復(fù)

使用道具 舉報

5#
ID:624769 發(fā)表于 2021-11-13 01:33 | 只看該作者
Hephaestus 發(fā)表于 2021-11-13 00:02
沒可能實現(xiàn)。#define是在預(yù)處理階段把MainForse直接簡單替換成24000000L,MainForse這個名字都不可能出現(xiàn)在 ...

假定, 我有 24000000 這個值,匯編也要用到,C 也要用到,除了兩個文件分別 用 define 和 EQU 之外,有什么別的變通的辦法,可以實現(xiàn)只在一個地方 設(shè)定?
回復(fù)

使用道具 舉報

6#
ID:401564 發(fā)表于 2021-11-13 12:13 | 只看該作者
188610329 發(fā)表于 2021-11-13 01:30
那么假定 我在  匯編里  
MainForse    EQU    24000D

沒有試過混編,不知道
但這沒什么意義,至少在當(dāng)前的8051單片機(jī)上,C和匯編混編沒什么實際的好處,99.99%的情況下,C是可以實現(xiàn)匯編的功能的
除了要精確一兩個時鐘的的時序程序,匯編沒什么優(yōu)勢可言,沒有必要深入這方面的東西,要么就是匯編,要么就是C
回復(fù)

使用道具 舉報

7#
ID:624769 發(fā)表于 2021-11-13 12:23 | 只看該作者
Y_G_G 發(fā)表于 2021-11-13 12:13
沒有試過混編,不知道
但這沒什么意義,至少在當(dāng)前的8051單片機(jī)上,C和匯編混編沒什么實際的好處,99.99%的 ...

好的,謝謝。

好處是: 代碼可以變小很多。
但是,可能年紀(jì)大了,全都用匯編的話……,腦殼疼……,只好退而求其次,混編。
回復(fù)

使用道具 舉報

8#
ID:401564 發(fā)表于 2021-11-13 13:24 | 只看該作者
188610329 發(fā)表于 2021-11-13 12:23
好的,謝謝。

好處是: 代碼可以變小很多。

代碼占用空間變小,我還真沒有覺得
如果說是在只有幾百B的低端國產(chǎn)單片機(jī)上,匯編是絕對需要的
程序空間超過1K的,用C來寫,盡量的調(diào)用函數(shù),匯編在代碼大小上是沒有優(yōu)勢的
只要你去熟練C的編程原則,總比啃匯編好
不會匯編的人多了去了,也就新手還在發(fā)帖問"內(nèi)存不夠怎么辦",有經(jīng)驗的單片機(jī)從業(yè)者,用C一樣的能寫出簡潔的程序出來
我之前就是用匯編的,用了幾年,煩了,累了
回復(fù)

使用道具 舉報

9#
ID:883242 發(fā)表于 2021-11-13 17:20 | 只看該作者
換STM8吧,51那120byte的直接尋址能力看了就想吐。
回復(fù)

使用道具 舉報

10#
ID:624769 發(fā)表于 2021-11-13 20:30 | 只看該作者
Y_G_G 發(fā)表于 2021-11-13 13:24
代碼占用空間變小,我還真沒有覺得
如果說是在只有幾百B的低端國產(chǎn)單片機(jī)上,匯編是絕對需要的
程序空間 ...

嗯……, 或許是我C語言的編寫能力太濫了吧……,畢竟我是業(yè)余的……
我是先學(xué)的C,后來,玩STC8的時候,碰到31之后的中斷號,才被迫的碰了點匯編的皮毛,那時候還是比較抵觸匯編的,再后來碰到幾個對時序要求非常嚴(yán)的問題,怎么也搞不定,才去學(xué)的匯編,不知道為什么,一開始認(rèn)真接觸匯編,忽然感覺一種奇特的親切感,利用匯編解決了那幾個時序問題之后,就開始仔細(xì)研究匯編。
越學(xué)越覺得這東西合我意啊,有一種直接操縱單片機(jī)的爽感,可以在整個FLASH里面隨意的跳,隨意的讀,不用去考慮有沒有聲明這個,有沒有聲明那個,也不會有在C里面那種,不能從這個函數(shù)直接跳去那個函數(shù)而不返回的郁悶。手握絕對操控權(quán)的感覺。 當(dāng)然,如果玩脫了,RET次數(shù)沒有計算控制好,PUSH,POP沒有配對,后期糾錯也相當(dāng)?shù)耐纯嗍隆?br /> 之后,歷時2年左右,通過用匯編重寫以前大量的程序,總算對匯編有了一定的掌握。在這個過程,大部分在用C寫的時候10K左右的程序(當(dāng)時不得不用STC15W408, IAP15W413以及后來STC8F2K16),匯編改寫后,很多順利的塞進(jìn)了STCW204里面。當(dāng)然,里面可能有一開始思考的不成熟,匯編改寫后,順便優(yōu)化了算法的功勞,但是在壓縮程序體積上,匯編還是有絕對的優(yōu)勢的。C語言無論你設(shè)計多精簡,最終還是不可能帶著A,R0~R7  從這個函數(shù)跳到那個函數(shù),也不可能在一個函數(shù)里通過反復(fù)切換RS0,RS1,讓函數(shù)同時操縱32個通用寄存器,但是,這些都是減小代碼量的有效手段。
說那么多,我不是說匯編有多好,只是想表達(dá),我有多喜歡匯編,奈何這方面的資料太少…… 很多目的無法實現(xiàn),可惜……
回復(fù)

使用道具 舉報

11#
ID:967119 發(fā)表于 2021-11-13 21:36 | 只看該作者
真的理解�?赡芫褪悄欠N一切盡在掌握中,程序都跑不飛的那種上帝視角的感覺。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表