找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

帖子
查看: 4803|回復(fù): 19
收起左側(cè)

好幾天了,果真無(wú)人能解嗎?對(duì)單片機(jī)printf函數(shù)的疑惑 各位大佬健康快樂(lè)

  [復(fù)制鏈接]
ID:362599 發(fā)表于 2022-9-17 12:01 | 顯示全部樓層 |閱讀模式
對(duì)printf函數(shù)的疑惑
各位大佬健康快樂(lè)!
請(qǐng)看如下問(wèn)題:
在程序中如果嵌入了匯編語(yǔ)言,則printf函數(shù)就會(huì)對(duì)浮點(diǎn)數(shù)出錯(cuò),何耶?


#include"stdio.h"
#include"reg51.h"
float xyz=123.45;
main()
{
//串口初始化();
printf("xyz=%8.3f\n",xyz);  //此時(shí)輸出正確“xyz=123.45”
while (1);
}

在程序中如果嵌入了匯編語(yǔ)言,則printf函數(shù)就會(huì)對(duì)浮點(diǎn)數(shù)出錯(cuò),何耶?

#include"stdio.h"
#include"reg51.h"
float xyz=123.45;
main()
{
//串口初始化();
#pragma asm
NOP
#pragma endasm

printf("xyz=%8.3f\n",xyz);  //此時(shí)輸出不正確:“xyz=??”
while (1);
}
回復(fù)

使用道具 舉報(bào)

ID:123289 發(fā)表于 2022-9-17 14:17 | 顯示全部樓層
是51單片機(jī)吧。
用的是哪一款芯片?
從什么地方輸出數(shù)據(jù)的?
數(shù)據(jù)接收方是什么?
接收到的數(shù)據(jù)是如何不同的?
能否將兩個(gè)程序,生成的匯編代碼貼出來(lái)。

回復(fù)

使用道具 舉報(bào)

ID:362599 發(fā)表于 2022-9-17 16:56 | 顯示全部樓層
yzwzfyz 發(fā)表于 2022-9-17 14:17
是51單片機(jī)吧。
用的是哪一款芯片?
從什么地方輸出數(shù)據(jù)的?

是51單片機(jī),AT89C52,程序及其簡(jiǎn)單,插入?yún)R編printf函數(shù)就會(huì)出錯(cuò)!編譯軟件是KIEL V3~V5都一樣不行!奇怪!
回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2022-9-17 21:37 | 顯示全部樓層
C和匯編混編是給高手用的
用C就純C
用匯編就純匯編
而且,你混的匯編就是一個(gè)空指令............
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2022-9-17 21:49 來(lái)自手機(jī) | 顯示全部樓層
就我知道,論壇里沒(méi)幾個(gè)人玩混編,就算玩混編,應(yīng)該也是多文件混編,插入式混編,本來(lái)就不好用,最后,就上個(gè)帖子我也說(shuō)過(guò),printf,玩混編的是看不上的,所以與其你要解這個(gè)問(wèn)題,不如寫(xiě)一個(gè)匯編的發(fā)送函數(shù),好的多。
回復(fù)

使用道具 舉報(bào)

ID:362599 發(fā)表于 2022-9-18 06:38 | 顯示全部樓層
Y_G_G 發(fā)表于 2022-9-17 21:37
C和匯編混編是給高手用的
用C就純C
用匯編就純匯編

一條空指令意味著讓單片機(jī)用匯編執(zhí)行最簡(jiǎn)單的動(dòng)作也不行。。。�?磥�(lái),KIEL V3~V5技止此耳
回復(fù)

使用道具 舉報(bào)

ID:883242 發(fā)表于 2022-9-18 06:49 | 顯示全部樓層
這個(gè)問(wèn)題跟匯編無(wú)關(guān),而是在8位機(jī)這個(gè)螺螄殼里面玩兒浮點(diǎn)數(shù)這種大規(guī)模道場(chǎng),也太不合理了。
回復(fù)

使用道具 舉報(bào)

ID:362599 發(fā)表于 2022-9-18 06:57 | 顯示全部樓層
Hephaestus 發(fā)表于 2022-9-18 06:49
這個(gè)問(wèn)題跟匯編無(wú)關(guān),而是在8位機(jī)這個(gè)螺螄殼里面玩兒浮點(diǎn)數(shù)這種大規(guī)模道場(chǎng),也太不合理了。

據(jù)說(shuō)F22里面都是4位處理器,但是現(xiàn)在仍然全無(wú)敵
回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2022-9-18 08:42 | 顯示全部樓層
cys9981 發(fā)表于 2022-9-18 06:38
一條空指令意味著讓單片機(jī)用匯編執(zhí)行最簡(jiǎn)單的動(dòng)作也不行。。。�?磥�(lái),KIEL V3~V5技止此耳

上一次說(shuō)出這類(lèi)驚世狂言的人,說(shuō)是只要用0和1機(jī)器碼寫(xiě)程序,我當(dāng)初不懂事,還跟他說(shuō)了半天的編程理論
對(duì)于你,我就不解釋了,我要去做核酸了,等下人多了不好排除了
回復(fù)

使用道具 舉報(bào)

ID:362599 發(fā)表于 2022-9-18 09:04 | 顯示全部樓層
Y_G_G 發(fā)表于 2022-9-18 08:42
上一次說(shuō)出這類(lèi)驚世狂言的人,說(shuō)是只要用0和1機(jī)器碼寫(xiě)程序,我當(dāng)初不懂事,還跟他說(shuō)了半天的編程理論
對(duì)于 ...

看來(lái)你就是不太董事,只能當(dāng)總工師,進(jìn)不了董事會(huì)了
回復(fù)

使用道具 舉報(bào)

ID:434018 發(fā)表于 2022-9-18 10:09 | 顯示全部樓層
看生成的匯編代碼,應(yīng)該可以找到問(wèn)題.
回復(fù)

使用道具 舉報(bào)

ID:83553 發(fā)表于 2022-9-18 12:34 | 顯示全部樓層
樓主的意思是printf輸出非浮點(diǎn)數(shù)是對(duì)的?
多年前我用過(guò)asm文件+c文件混編,樓主這樣用法,什么資料上有介紹?
回復(fù)

使用道具 舉報(bào)

ID:362599 發(fā)表于 2022-9-18 15:17 | 顯示全部樓層
mcza30 發(fā)表于 2022-9-18 12:34
樓主的意思是printf輸出非浮點(diǎn)數(shù)是對(duì)的?
多年前我用過(guò)asm文件+c文件混編,樓主這樣用法,什么資料上有介 ...

KIEL V3~V5均允許示例程序中的匯編語(yǔ)句的嵌入混編。
回復(fù)

使用道具 舉報(bào)

ID:883242 發(fā)表于 2022-9-18 18:21 | 顯示全部樓層
cys9981 發(fā)表于 2022-9-18 06:57
據(jù)說(shuō)F22里面都是4位處理器,但是現(xiàn)在仍然全無(wú)敵

誰(shuí)跟說(shuō)的?能不能不造謠???F-22的CIP(central integrated processor)用的是i960MX,90年代RISC處理器大行其道的時(shí)候,intel推出來(lái)的試水之作,性能相當(dāng)于高端486或者最低端Pentium。CIP一個(gè)cluster有35個(gè)i960MX。中國(guó)進(jìn)入網(wǎng)絡(luò)時(shí)代已經(jīng)二十多年了,還在傳播這種低級(jí)趣味的無(wú)根據(jù)小道消息有意思嗎?
回復(fù)

使用道具 舉報(bào)

ID:429003 發(fā)表于 2022-9-19 09:42 | 顯示全部樓層
先檢查一下,標(biāo)準(zhǔn)庫(kù)的鏈接設(shè)置是否一樣的! 如果在一工程配置下,出現(xiàn)這種問(wèn)題,是挺費(fèi)解的,printf如果要正常工作,須保證兩點(diǎn):1.正確的配置標(biāo)準(zhǔn)庫(kù)。2:對(duì)于浮點(diǎn)數(shù)的處理,堆棧指針至少8字節(jié)對(duì)齊!還有一個(gè)可能,是不是堆棧設(shè)計(jì)太小,進(jìn)入main時(shí),堆棧已經(jīng)溢出了???仔細(xì)檢查,這類(lèi)問(wèn)題看似摸不到頭腦,問(wèn)題根源可能只是個(gè)很簡(jiǎn)單的配置錯(cuò)誤。
回復(fù)

使用道具 舉報(bào)

ID:83553 發(fā)表于 2022-9-19 10:32 | 顯示全部樓層
cys9981 發(fā)表于 2022-9-18 15:17
KIEL V3~V5均允許示例程序中的匯編語(yǔ)句的嵌入混編。

謝謝。
回復(fù)

使用道具 舉報(bào)

ID:748788 發(fā)表于 2022-9-19 10:41 | 顯示全部樓層
如果樓主懷疑是編譯的問(wèn)題,那就只能找keil說(shuō)道說(shuō)道了。一般用戶(hù)遇到編譯問(wèn)題還是能繞就繞吧,寫(xiě)程序還是要靈活一些的。
回復(fù)

使用道具 舉報(bào)

ID:1045193 發(fā)表于 2022-9-19 16:52 | 顯示全部樓層
出現(xiàn)以下錯(cuò)誤:
error C272: 'asm/endasm' requires src-control to be active
解決方法:在 Files Toolbar 中選中當(dāng)前C51文件,點(diǎn)右鍵查看文件選項(xiàng),將 Generate Assembler SRC File 與 Assemble SRC File 的勾選由灰色變?yōu)楹谏词惯@兩項(xiàng)有效!
這時(shí)進(jìn)行編譯沒(méi)有問(wèn)題,但是Link時(shí)產(chǎn)生了兩個(gè)警告:
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
解決方法是需要在 Source Group 中添加一個(gè) LIB 文件,根據(jù)內(nèi)容不同有所區(qū)別:
C51S.LIB - 沒(méi)有浮點(diǎn)運(yùn)算的 Small model
C51C.LIB - 沒(méi)有浮點(diǎn)運(yùn)算的 Compact model
C51L.LIB - 沒(méi)有浮點(diǎn)運(yùn)算的 Large model
C51FPS.LIB - 帶浮點(diǎn)運(yùn)算的 Small model
回復(fù)

使用道具 舉報(bào)

ID:883242 發(fā)表于 2022-9-20 23:39 | 顯示全部樓層
wwh2382 發(fā)表于 2022-9-19 10:41
如果樓主懷疑是編譯的問(wèn)題,那就只能找keil說(shuō)道說(shuō)道了。一般用戶(hù)遇到編譯問(wèn)題還是能繞就繞吧,寫(xiě)程序還是要 ...

Keil搞了這么多年,比論壇大部分人的年紀(jì)都大,怎么可能有隨便哪個(gè)貓々狗々能找出的bug?

太多的細(xì)節(jié)問(wèn)題能造成錯(cuò)誤,隨便舉例,樓主用的是#include<reg51.h>那么能直接訪問(wèn)的ram只有128字節(jié),鏈接可能用256字節(jié)單片機(jī),實(shí)際用的是什么?鬼都不知道!
回復(fù)

使用道具 舉報(bào)

ID:362599 發(fā)表于 2022-9-21 06:53 | 顯示全部樓層
即便是#include<reg58.h>也不行!歲數(shù)大小與學(xué)識(shí)無(wú)關(guān)!太老了就會(huì)得阿爾茨海默癥。。。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

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