找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2771|回复: 19
打印 上一主题 下一主题
收起左侧

好几天了,果真无人能解吗?对单片机printf函数的疑惑 各位大佬健康快乐

  [复制链接]
跳转到指定楼层
楼主
ID:362599 发表于 2022-9-17 12:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
对printf函数的疑惑
各位大佬健康快乐!
请看如下问题:
在程序中如果嵌入了汇编语言,则printf函数就会对浮点数出错,何耶?


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

在程序中如果嵌入了汇编语言,则printf函数就会对浮点数出错,何耶?

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

printf("xyz=%8.3f\n",xyz);  //此时输出不正确:“xyz=??”
while (1);
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:123289 发表于 2022-9-17 14:17 | 只看该作者
是51单片机吧。
用的是哪一款芯片?
从什么地方输出数据的?
数据接收方是什么?
接收到的数据是如何不同的?
能否将两个程序,生成的汇编代码贴出来。

回复

使用道具 举报

板凳
ID:362599 发表于 2022-9-17 16:56 | 只看该作者
yzwzfyz 发表于 2022-9-17 14:17
是51单片机吧。
用的是哪一款芯片?
从什么地方输出数据的?

是51单片机,AT89C52,程序及其简单,插入汇编printf函数就会出错!编译软件是KIEL V3~V5都一样不行!奇怪!
回复

使用道具 举报

地板
ID:401564 发表于 2022-9-17 21:37 | 只看该作者
C和汇编混编是给高手用的
用C就纯C
用汇编就纯汇编
而且,你混的汇编就是一个空指令............
回复

使用道具 举报

5#
ID:624769 发表于 2022-9-17 21:49 来自手机 | 只看该作者
就我知道,论坛里没几个人玩混编,就算玩混编,应该也是多文件混编,插入式混编,本来就不好用,最后,就上个帖子我也说过,printf,玩混编的是看不上的,所以与其你要解这个问题,不如写一个汇编的发送函数,好的多。
回复

使用道具 举报

6#
ID:362599 发表于 2022-9-18 06:38 | 只看该作者
Y_G_G 发表于 2022-9-17 21:37
C和汇编混编是给高手用的
用C就纯C
用汇编就纯汇编

一条空指令意味着让单片机用汇编执行最简单的动作也不行。。。。看来,KIEL V3~V5技止此耳
回复

使用道具 举报

7#
ID:883242 发表于 2022-9-18 06:49 | 只看该作者
这个问题跟汇编无关,而是在8位机这个螺蛳壳里面玩儿浮点数这种大规模道场,也太不合理了。
回复

使用道具 举报

8#
ID:362599 发表于 2022-9-18 06:57 | 只看该作者
Hephaestus 发表于 2022-9-18 06:49
这个问题跟汇编无关,而是在8位机这个螺蛳壳里面玩儿浮点数这种大规模道场,也太不合理了。

据说F22里面都是4位处理器,但是现在仍然全无敌
回复

使用道具 举报

9#
ID:401564 发表于 2022-9-18 08:42 | 只看该作者
cys9981 发表于 2022-9-18 06:38
一条空指令意味着让单片机用汇编执行最简单的动作也不行。。。。看来,KIEL V3~V5技止此耳

上一次说出这类惊世狂言的人,说是只要用0和1机器码写程序,我当初不懂事,还跟他说了半天的编程理论
对于你,我就不解释了,我要去做核酸了,等下人多了不好排除了
回复

使用道具 举报

10#
ID:362599 发表于 2022-9-18 09:04 | 只看该作者
Y_G_G 发表于 2022-9-18 08:42
上一次说出这类惊世狂言的人,说是只要用0和1机器码写程序,我当初不懂事,还跟他说了半天的编程理论
对于 ...

看来你就是不太董事,只能当总工师,进不了董事会了
回复

使用道具 举报

11#
ID:434018 发表于 2022-9-18 10:09 | 只看该作者
看生成的汇编代码,应该可以找到问题.
回复

使用道具 举报

12#
ID:83553 发表于 2022-9-18 12:34 | 只看该作者
楼主的意思是printf输出非浮点数是对的?
多年前我用过asm文件+c文件混编,楼主这样用法,什么资料上有介绍?
回复

使用道具 举报

13#
ID:362599 发表于 2022-9-18 15:17 | 只看该作者
mcza30 发表于 2022-9-18 12:34
楼主的意思是printf输出非浮点数是对的?
多年前我用过asm文件+c文件混编,楼主这样用法,什么资料上有介 ...

KIEL V3~V5均允许示例程序中的汇编语句的嵌入混编。
回复

使用道具 举报

14#
ID:883242 发表于 2022-9-18 18:21 | 只看该作者
cys9981 发表于 2022-9-18 06:57
据说F22里面都是4位处理器,但是现在仍然全无敌

谁跟说的?能不能不造谣???F-22的CIP(central integrated processor)用的是i960MX,90年代RISC处理器大行其道的时候,intel推出来的试水之作,性能相当于高端486或者最低端Pentium。CIP一个cluster有35个i960MX。中国进入网络时代已经二十多年了,还在传播这种低级趣味的无根据小道消息有意思吗?
回复

使用道具 举报

15#
ID:429003 发表于 2022-9-19 09:42 | 只看该作者
先检查一下,标准库的链接设置是否一样的! 如果在一工程配置下,出现这种问题,是挺费解的,printf如果要正常工作,须保证两点:1.正确的配置标准库。2:对于浮点数的处理,堆栈指针至少8字节对齐!还有一个可能,是不是堆栈设计太小,进入main时,堆栈已经溢出了???仔细检查,这类问题看似摸不到头脑,问题根源可能只是个很简单的配置错误。
回复

使用道具 举报

16#
ID:83553 发表于 2022-9-19 10:32 | 只看该作者
cys9981 发表于 2022-9-18 15:17
KIEL V3~V5均允许示例程序中的汇编语句的嵌入混编。

谢谢。
回复

使用道具 举报

17#
ID:748788 发表于 2022-9-19 10:41 | 只看该作者
如果楼主怀疑是编译的问题,那就只能找keil说道说道了。一般用户遇到编译问题还是能绕就绕吧,写程序还是要灵活一些的。
回复

使用道具 举报

18#
ID:1045193 发表于 2022-9-19 16:52 | 只看该作者
出现以下错误:
error C272: 'asm/endasm' requires src-control to be active
解决方法:在 Files Toolbar 中选中当前C51文件,点右键查看文件选项,将 Generate Assembler SRC File 与 Assemble SRC File 的勾选由灰色变为黑色,即使这两项有效!
这时进行编译没有问题,但是Link时产生了两个警告:
*** WARNING L1: UNRESOLVED EXTERNAL SYMBOL
*** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL
解决方法是需要在 Source Group 中添加一个 LIB 文件,根据内容不同有所区别:
C51S.LIB - 没有浮点运算的 Small model
C51C.LIB - 没有浮点运算的 Compact model
C51L.LIB - 没有浮点运算的 Large model
C51FPS.LIB - 带浮点运算的 Small model
回复

使用道具 举报

19#
ID:883242 发表于 2022-9-20 23:39 | 只看该作者
wwh2382 发表于 2022-9-19 10:41
如果楼主怀疑是编译的问题,那就只能找keil说道说道了。一般用户遇到编译问题还是能绕就绕吧,写程序还是要 ...

Keil搞了这么多年,比论坛大部分人的年纪都大,怎么可能有随便哪个猫々狗々能找出的bug?

太多的细节问题能造成错误,随便举例,楼主用的是#include<reg51.h>那么能直接访问的ram只有128字节,链接可能用256字节单片机,实际用的是什么?鬼都不知道!
回复

使用道具 举报

20#
ID:362599 发表于 2022-9-21 06:53 | 只看该作者
即便是#include<reg58.h>也不行!岁数大小与学识无关!太老了就会得阿尔茨海默症。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表