打印
[51单片机]

请教,C51 除法运算,同时求“ 商、余数 ”,怎样用插入汇编来完成

[复制链接]
2264|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
大家好。
请教一下,C51 除法运算,同时求“ 商、余数 ”,请问怎样用插入汇编来完成?
这个除法运算,同时求商和余数,感觉用 C 语句,太占用 CPU 的时间(不知道是不是?),好像 51 单片机 的汇编除法,是可以同时求商和余数的,但是,我不懂汇编,更不懂怎样把 C 的变量传递到汇编,然后还要把结果返回给 C 。
请注意,要求这条语句不能受中断函数的干扰。
我的意思如下面的代码,在此感谢先

unsigned char  u8a, u8b, u8c, u8d;

// 上面的变量固定为 C51 格式,请问下面的两条语句,怎样用汇编 DIV AB 指令来编写?

        u8c = u8a / u8b ;
        u8d = u8a % u8b ;


使用特权

评论回复

相关帖子

沙发
panxiaoyi|  楼主 | 2024-12-1 22:08 | 只看该作者
本帖最后由 panxiaoyi 于 2024-12-1 22:40 编辑

我在实际的应用中,需要经常的用到除法运算,求 “商、余数”,变量就是 8 位。比如,把温度转化为百十个位数,用数码管显示,还有实时的调控温度,都经常用到这个计算。当然,如果汇编代码比较复杂,那就不敢麻烦大家了,太复杂的插入汇编,我也担心自己吃不消。
如果不复杂,这倒是一个很好的替代。
对了,我上面的两条代码,C51 会不会聪明的优化成一个汇编模块呢?如果会,那就不用杞人忧天了。

使用特权

评论回复
板凳
ayb_ice| | 2024-12-2 08:42 | 只看该作者
8位乘法,除法51直接支持,用汇编也没有多大提升空间,意义不大,不用汇编,余数在B寄存器中,可以直接访问

使用特权

评论回复
地板
xionghaoyun| | 2024-12-2 09:12 | 只看该作者
汇编打扰了

使用特权

评论回复
5
pang7| | 2024-12-2 11:50 | 只看该作者
编译器的算法可以反汇编看看 我记得是比较差的 增强型的51里面汇编有乘除法指令。用汇编自己写一个会好一点。

使用特权

评论回复
6
海洋无限| | 2024-12-2 12:39 | 只看该作者
汇编现在会的人越来越少了,要40+才可能接触过吧

使用特权

评论回复
7
xch| | 2024-12-2 12:41 | 只看该作者
看看有没有这个函数 : int remquo (int x, int y , int *quo);

使用特权

评论回复
8
567| | 2024-12-2 19:06 | 只看该作者
仅针对C51的话,可以这样:
u8c = u8a / u8b;
u8d = B;

使用特权

评论回复
9
panxiaoyi|  楼主 | 2024-12-2 21:11 | 只看该作者
@ayb_ice,@567
大家好
u8d = B;
这个的确是个好主意,不过,就怕在这条语句的前面,发生了中断,而改变了 B 的值,当然,我的中断里面一般不会有乘法除法的,中断里面正常都是一些加减法、位运算、逻辑判断之类的,就是不知道这些是否会改变 B 的值,不过也算是学到了一点知识,以后留意一下汇编仿真看看 ( 看不懂也要看看 )

使用特权

评论回复
10
panxiaoyi|  楼主 | 2024-12-2 21:39 | 只看该作者
查阅了一下芯片的规格书,看来只要中断里面没有乘除法,那么,在主程序里面去读取 B 寄存器应该是安全的,当然,还是需要请大家指点一下

微信图片_20241202213842.png (371.33 KB )

微信图片_20241202213842.png

使用特权

评论回复
11
567| | 2024-12-2 22:56 | 只看该作者
panxiaoyi 发表于 2024-12-2 21:39
查阅了一下芯片的规格书,看来只要中断里面没有乘除法,那么,在主程序里面去读取 B 寄存器应该是安全的, ...

你多虑了,中断进入时要保护寄存器,中断退出时恢复寄存器。
不止是B,任何用到的寄存器都要保存。

使用特权

评论回复
12
zhoupxa| | 2024-12-2 23:19 | 只看该作者
在51单片机上有时需要执行一些比较耗费时空资源的运算,比如开平方、CRC校验等,这时可以利用C51编译器提供的汇编语言程序接口,把功能模块用汇编语言编写、通过C函数调用解决上述矛盾,可参考C51编译器手册:


现在高性能低成本的单片机有很多选择,这方面的问题已经不再是问题了。

使用特权

评论回复
13
ayb_ice| | 2024-12-3 08:24 | 只看该作者
panxiaoyi 发表于 2024-12-2 21:11
@ayb_ice,@567
大家好
u8d = B;

中断如果用到了B,会压本栈保护的,不用担心

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

50

主题

398

帖子

2

粉丝