找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 778|回复: 10
收起左侧

问一个C语言汇编 之间互相调用的问题

[复制链接]
ID:624769 发表于 2021-11-12 22:44 | 显示全部楼层 |阅读模式
在 C 语言中,如果声明一个变量,
unsigned char ABC;
在汇编中 可以用
extrn DATA(ABC)
来调用,

那么,C 语言中一个define  如:
#define MainForse  24000000L
在汇编中应该怎么调用?

回复

使用道具 举报

ID:883242 发表于 2021-11-13 00:02 | 显示全部楼层
没可能实现。#define是在预处理阶段把MainForse直接简单替换成24000000L,MainForse这个名字都不可能出现在obj文件里面,更别说让linker找到跟asm编译出来的obj连接在一起了。
回复

使用道具 举报

ID:401564 发表于 2021-11-13 00:25 | 显示全部楼层
#define MainForse  24000000L
这个只是文本上替换而已,不会被编译的
而且,#define 是可以在汇编环境下使用的,但是汇编几乎每个指令都是地址有有关,#define还不如EQU实用,所以,一般的汇编是不用#define的
当然,我见过一些由C转汇编的人喜欢用#define
回复

使用道具 举报

ID:624769 发表于 2021-11-13 01:30 | 显示全部楼层
Y_G_G 发表于 2021-11-13 00:25
#define MainForse  24000000L
这个只是文本上替换而已,不会被编译的
而且,#define 是可以在汇编环境下使 ...

那么假定 我在  汇编里  
MainForse    EQU    24000D

在 C 里面有办法调用么?
现在主要问题是,在混合编写的时候,有些设定,两头都设定,在修改时,容易出现错漏,所以希望能有可以两边都引用的方法。
回复

使用道具 举报

ID:624769 发表于 2021-11-13 01:33 | 显示全部楼层
Hephaestus 发表于 2021-11-13 00:02
没可能实现。#define是在预处理阶段把MainForse直接简单替换成24000000L,MainForse这个名字都不可能出现在 ...

假定, 我有 24000000 这个值,汇编也要用到,C 也要用到,除了两个文件分别 用 define 和 EQU 之外,有什么别的变通的办法,可以实现只在一个地方 设定?
回复

使用道具 举报

ID:401564 发表于 2021-11-13 12:13 | 显示全部楼层
188610329 发表于 2021-11-13 01:30
那么假定 我在  汇编里  
MainForse    EQU    24000D

没有试过混编,不知道
但这没什么意义,至少在当前的8051单片机上,C和汇编混编没什么实际的好处,99.99%的情况下,C是可以实现汇编的功能的
除了要精确一两个时钟的的时序程序,汇编没什么优势可言,没有必要深入这方面的东西,要么就是汇编,要么就是C
回复

使用道具 举报

ID:624769 发表于 2021-11-13 12:23 | 显示全部楼层
Y_G_G 发表于 2021-11-13 12:13
没有试过混编,不知道
但这没什么意义,至少在当前的8051单片机上,C和汇编混编没什么实际的好处,99.99%的 ...

好的,谢谢。

好处是: 代码可以变小很多。
但是,可能年纪大了,全都用汇编的话……,脑壳疼……,只好退而求其次,混编。
回复

使用道具 举报

ID:401564 发表于 2021-11-13 13:24 | 显示全部楼层
188610329 发表于 2021-11-13 12:23
好的,谢谢。

好处是: 代码可以变小很多。

代码占用空间变小,我还真没有觉得
如果说是在只有几百B的低端国产单片机上,汇编是绝对需要的
程序空间超过1K的,用C来写,尽量的调用函数,汇编在代码大小上是没有优势的
只要你去熟练C的编程原则,总比啃汇编好
不会汇编的人多了去了,也就新手还在发帖问"内存不够怎么办",有经验的单片机从业者,用C一样的能写出简洁的程序出来
我之前就是用汇编的,用了几年,烦了,累了
回复

使用道具 举报

ID:883242 发表于 2021-11-13 17:20 | 显示全部楼层
换STM8吧,51那120byte的直接寻址能力看了就想吐。
回复

使用道具 举报

ID:624769 发表于 2021-11-13 20:30 | 显示全部楼层
Y_G_G 发表于 2021-11-13 13:24
代码占用空间变小,我还真没有觉得
如果说是在只有几百B的低端国产单片机上,汇编是绝对需要的
程序空间 ...

嗯……, 或许是我C语言的编写能力太滥了吧……,毕竟我是业余的……
我是先学的C,后来,玩STC8的时候,碰到31之后的中断号,才被迫的碰了点汇编的皮毛,那时候还是比较抵触汇编的,再后来碰到几个对时序要求非常严的问题,怎么也搞不定,才去学的汇编,不知道为什么,一开始认真接触汇编,忽然感觉一种奇特的亲切感,利用汇编解决了那几个时序问题之后,就开始仔细研究汇编。
越学越觉得这东西合我意啊,有一种直接操纵单片机的爽感,可以在整个FLASH里面随意的跳,随意的读,不用去考虑有没有声明这个,有没有声明那个,也不会有在C里面那种,不能从这个函数直接跳去那个函数而不返回的郁闷。手握绝对操控权的感觉。 当然,如果玩脱了,RET次数没有计算控制好,PUSH,POP没有配对,后期纠错也相当的痛苦事。
之后,历时2年左右,通过用汇编重写以前大量的程序,总算对汇编有了一定的掌握。在这个过程,大部分在用C写的时候10K左右的程序(当时不得不用STC15W408, IAP15W413以及后来STC8F2K16),汇编改写后,很多顺利的塞进了STCW204里面。当然,里面可能有一开始思考的不成熟,汇编改写后,顺便优化了算法的功劳,但是在压缩程序体积上,汇编还是有绝对的优势的。C语言无论你设计多精简,最终还是不可能带着A,R0~R7  从这个函数跳到那个函数,也不可能在一个函数里通过反复切换RS0,RS1,让函数同时操纵32个通用寄存器,但是,这些都是减小代码量的有效手段。
说那么多,我不是说汇编有多好,只是想表达,我有多喜欢汇编,奈何这方面的资料太少…… 很多目的无法实现,可惜……
回复

使用道具 举报

ID:967119 发表于 2021-11-13 21:36 | 显示全部楼层
真的理解。可能就是那种一切尽在掌握中,程序都跑不飞的那种上帝视角的感觉。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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