You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 10:48:02