8051平台下Raisonance C编译器调用汇编函数时参数传递引发的链接错误排查请求
8051平台下Raisonance C编译器调用汇编函数时参数传递引发的链接错误排查请求
看起来你遇到的是Raisonance 8051工具链里,汇编函数和C代码跨语言调用时的参数段定义不匹配问题,我来帮你理清楚怎么修复这个链接错误:
错误原因拆解
这个***ERROR 100 : UNRESOLVED EXTERNAL SYMBOL : ?_rotr?BYTE(MAIN)错误,本质是你汇编代码里定义的参数存储段,和Raisonance C编译器期望的段命名规则不匹配。
对于rotr(uint32_t, uint8_t)这种多参数函数,编译器会把第一个32位参数放在寄存器里(符合你说的规则),但第二个8位参数会要求存在一个特定命名的伪静态数据段里,你之前自定义的_rotr段完全不符合这个命名规范,所以链接器找不到对应的参数存储位置。
具体修改方案
直接调整汇编代码里的参数段定义部分,完全匹配编译器的命名规则就好,修改后的完整汇编代码如下:
$include (reg51.inc) ; 修正参数存储段:用编译器期望的?_rotr?BYTE作为段名 ?_rotr?BYTE SEGMENT DATA OVERLAYABLE RSEG ?_rotr?BYTE ; 给第二个uint8_t参数预留1字节空间,自定义标签方便汇编里访问 param2: DS 1 bitops SEGMENT CODE RSEG bitops PUBLIC _rotr _rotr: PUSH ACC ; 这里可以直接用param2访问第二个参数,比如 MOV A, param2 ; 你的位操作逻辑代码... POP ACC RET END
关键修改点说明
- 把原来的
_rotr段名改成?_rotr?BYTE:这是Raisonance C编译器针对rotr函数第二个8位参数生成的固定段名格式,必须严格匹配 - 去掉参数段的
PUBLIC声明:这个段是编译器和链接器自动关联到函数的,不需要手动公开 - 汇编逻辑里可以通过你自定义的
param2标签直接读取第二个参数的值
改完之后重新编译链接,那个未解析外部符号的错误应该就消失了。
内容来源于stack exchange
相关产品推荐
相关产品推荐

