4166|11

68

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

能不能让KEIL C变聪明点? [复制链接]

当我们要对一个数同时做取模和取商的操作时在 KEIL C 中这样表示

  1. unsigned int i,j,k;
  2. i=k%15;
  3. j=k/15;
复制代码

然后察看KEIL C生成的汇编码,发现它调用了两次除法子程序,实际上应该是只需要调用一次就可以的啊。 查KEIL C 的库函数好像也没有相关的库函数,请问怎么解决这个问题啊? 只要调用一次除法子程序就好了,可以大大的提高程序执行效率和减少代码长度

最新回复

楼上的高,学习了。   详情 回复 发表于 2008-4-14 18:45
点赞 关注

回复
举报

45

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
个人以为 这样已经够精简了吧? 还能提高?
=======================
具体不清楚 ,期待高手来解答
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
keil本身有一定优化功能,你首先得打开设置不同的优化选项试试
keil针对不同的芯片,优化过分了可能产生兼容性问题。
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

4
 
呵呵,这样的优化有好有坏啊,有的时候该优化,有的时候又不能优化啊。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

5
 
那么有没有无符号整数的除法程序,能同时得到商和余数的?
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

6
 
你写成
unsigned int i,j,k;
i=k%15;
j=i;


不就行了
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

7
 
呵呵,看错了
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

8
 
嵌入汇编,除完之后把B寄存器的内容拿出来
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 7 楼 Kethon 的回复:
嵌入汇编,除完之后把B寄存器的内容拿出来

我看过KEIL C生成的汇编语句,除法程序返回后余数在 R4,R5寄存器,商在 R6,R7寄存器,可问题是KEIL C里面怎么直接访问 R4,R5寄存器呢? 我不想用嵌入汇编语言的形式,这样也是超级麻烦,还要先生成 SRC文件
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

10
 
这个不应该是KEIL 的问题吧   就是纯C问题

除了调用汇编似乎没有更好的办法了
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

11
 

  1. #include
  2. #include


  3. #define yushu DWORD[4/sizeof(unsigned int)]
  4.   
  5. main()
  6. {       
  7.         unsigned int  i,j,k=23456;
  8.        
  9.         i=k/15;
  10.         j=yushu;
  11. }
复制代码



DWORD 是keil C51的一个宏

以下是引用自keil动官方文档...............................................................
DWORD
The DWORD macro accesses individual words in the internal data and idata memory of the 8051. You may use this macro in your programs as follows:

#include     /* Include Macro Definitions */
.
.
.
rval = DWORD [0x0002];
DWORD [0x0002] = 57;
.
.
.
This example reads and writes the contents of the word in internal data memory at address 0004h (2 × sizeof (unsigned int) = 4).

The range of valid index values for this macro is 0-127.

Note

The index used with this macro does not represent the memory address of the integer value. To obtain the memory address, you must multiply the index by the size of an integer (2 bytes).
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

12
 
楼上的高,学习了。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表