找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3928|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

keil c51單片機(jī)中調(diào)用一個已聲明但未定義的函數(shù),發(fā)生的一個奇怪的問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:248705 發(fā)表于 2018-10-14 23:48 | 只看該作者 |只看大圖 回帖獎勵 |正序瀏覽 |閱讀模式
如題,今天在調(diào)單片機(jī)程序的時候(用的stc89c51),聲明了很多函數(shù),但有一個忘記寫函數(shù)體,在主程序中調(diào)用,只報了警告,于是并沒有上心,急急忙忙下程序到單片機(jī),發(fā)現(xiàn)程序不能正常運(yùn)行。。。抓耳撓腮了半個小時(點擊警告不能定位),才發(fā)現(xiàn)有一個函數(shù)沒有寫函數(shù)體,寫上函數(shù)體后,程序正常執(zhí)行。索性來了興趣,為什么程序會不正常執(zhí)行,寫了一段測試程序,如圖: 仿真中運(yùn)行發(fā)現(xiàn)編譯器對于僅聲明的函數(shù),會將其地址指向0x0000,也就是主程序的入口main,每當(dāng)程序執(zhí)行到這個僅有聲明的“函數(shù)”時,就會從0000從新開始。。。。貌似發(fā)現(xiàn)了新大陸?stc89c51的軟復(fù)位?但其實我并不知道原理,也不是很了解匯編,為何會這樣。。。。求大佬指點。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:387733 發(fā)表于 2018-10-15 07:10 | 只看該作者
軟件編譯有兩個步驟,第一步對各個模塊編譯,因為編譯過程中地址是無法定位的,過程中對于所有不能定位的地址,包括已經(jīng)申明過的地址指向暫用“0000”占位。第二步是將各個編譯好的模塊連接定位,將編譯時預(yù)留的“0000”用實際地址替換掉。如果只有聲明,沒有函數(shù)體,那么在連接時就無法定位實際地址,所以仍保留“0000”,這時系統(tǒng)會給出警告,因此對于有些警告必須重視,否則會引起麻煩。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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