在汇编下如何使用Ai的CDC库?
本帖最后由 DebugLab 于 2024-11-27 09:56 编辑我们的原汇编程序编译成功。想将STC的汇编CDC程序库加入。
1. 打开STC的CDC汇编演示程序,采用xdata版本。编译无错误无警告。
2. 在前面的常数和变量定义区加入我们原程序的常数和变量定义。编译通过无错误无警告。
3. 在STC模板程序的标号MAIN:后屏蔽掉JMP MAIN语句,逐段加入我们的程序。每加入一段就编译,无错误、无警告。当然是要处理好一些程序之间调用。
4. 当加入了约1000行语句后,编译出现如下错误提示信息:
Build started: Project: CT-ASTC12N
Build target 'Target 1'
assembling CT-A_STC8H-A.asm...
linking...
*** ERROR L121: IMPROPER FIXUP
MODULE:.\Objects\CT-A_STC8H-A.obj (CT-A_STC8H-A)
SEGMENT: ?PR?MAIN
OFFSET:0002F8H
*** ERROR L121: IMPROPER FIXUP
MODULE:.\Objects\CT-A_STC8H-A.obj (CT-A_STC8H-A)
SEGMENT: ?PR?MAIN
OFFSET:00030BH
*** ERROR L121: IMPROPER FIXUP
MODULE:.\Objects\CT-A_STC8H-A.obj (CT-A_STC8H-A)
SEGMENT: ?PR?MAIN
OFFSET:000365H
*** ERROR L121: IMPROPER FIXUP
MODULE:.\Objects\CT-A_STC8H-A.obj (CT-A_STC8H-A)
SEGMENT: ?PR?MAIN
OFFSET:000386H
*** ERROR L121: IMPROPER FIXUP
MODULE:.\Objects\CT-A_STC8H-A.obj (CT-A_STC8H-A)
SEGMENT: ?PR?MAIN
OFFSET:000702H
Program Size: data=8.3 xdata=247 const=131 code=6919
Target not created.
Build Time Elapsed:00:00:00
反复检查好像不是我们程序的问题,程序没有特别语句。将我们的程序单独编译,也就是去掉STC模板程序的其它语句能够编译成功。
之前加入部分的我们的汇编程序可以编译成功。多了好像就不行了。
请教如何解决上述问题?
51 开源 汇编语言调用USB-CDC库文件实现USB-CDC虚拟串口通信,取代传统串口 - USB:USB-CDC虚拟串口/就是串口,一箭双雕之USB转双串口,[鼠标+键盘]的HID复合设备 国芯技术交流网站 - AI32位8051交流社区 (stcaimcu.com)
估计你用单个主程序汇编文件, 调用 stc的 汇编CDC程序库.
文件超长, 会出现此类 linking 问题.
解决方法:
1.换个 linking 器 试试, L51 或者 LX51
2. 如上述方法不行, 哪没办法, 只能规范汇编编程(你上述单个主程序文件内, 调用太多的文件内部子程序, 属于不规范),
如不再调用 外部 汇编文件, 主程序文件再长也行.
如要调用 外部 汇编文件(只要其有一点点不规范), 当单个主程序文件大了, 容易出现此类 linking 问题.
彻底解决方法, 单个主程序文件内, 按功能模块分类, 每个功能模块单独建立规范汇编文件(当然, 每个子程序 单独建立一个独立文件或库文件更好). 总之, 细分的越小越好, 再依靠 linking 器把他们联接起来. 从本质上讲, 单个子程序文件不得超过 2k , 因为子程序 内少不了 页内 offset 跳转, 而 51 以 2k 为一页.
编译时, 依靠 linking 器把他们自动定位在合适地址上 , 再联接起来.
当单个程序文件超过 2k 时(特别是超出太多), 超出了 linking 器 自动定位 的能力范围, 因此而给出警告或错误信息. 总之, 以上问题 , 首先是你的 程序不规范(主程序内调用多个子程序, 且放在单个同一个文件中).
其次, 是 STC 提供的汇编CDC程序库 不规范(能用不等于规范, STC肯定是将多个子程序合在 一个文件中, 再编译成 Lib 或 Obj 文件).
假如 汇编CDC程序库 格式非常正规规范的话, 不管你的程序再烂再长再不规范, 永远不会产生linking 错误. 想到一个方法, 你可以试试, 先将 stc 的汇编CDC程序库, 定位在 你程序空间尾部(方法可参照 stc 说明书中相关的程序重定位),
地址以 2k的倍数为单位, 或以 stc 的汇编CDC程序库 的长度, 定位 在 code空间末尾倒推 之地址上. 这样,linking 时,stc 的汇编CDC程序库 地址, 是固定不变的.
再编译你的程序, 如能通过, 则不管你的程序有多长(当然不能超出stc 的汇编CDC程序库code空间的首地址), 估计都能通过. 这个方法虽不太正规, 但用时最少.
最好的方法是你修改程序, 使其规范化, 这样, 哪怕 用 stc 的 C语言编写 的CDC程序库, 也能轻松调用(混合编程).
{:4_165:} {:4_250:} 在下还在苦学C语言,你却要学汇编
加油吧同学,等你学会了 出个教程,或者写个学习例程分享出来 国学芯用 发表于 2024-11-27 15:14
在下还在苦学C语言,你却要学汇编
加油吧同学,等你学会了 出个教程,或者写个学习例程分享出来 ...
汇编 有 汇编的特色.
汇编 的 速度, 是 C 的 1.5倍 左右. 速度更快.
汇编 的 bin长度, 比 C 短 1.5倍 左右. 同等芯片下可放进更多程序功能.
同样, 汇编 的 开发速度,比 C 慢 N 倍~~~ {:cry:}