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

Delphi内联汇编转C++ Builder报@test未定义错误如何解决

问题原因

BCC32(C++ Builder 32位编译器)的内联汇编语法、符号规则和Delphi内联汇编不兼容,这是报错的核心原因:

  • Delphi内联汇编规则中,@开头的标签是汇编块内的局部标签,可直接被OFFSET运算符识别引用
  • BCC32内联汇编规则中,单个@开头的标识符属于编译器保留的特殊符号范畴,用户在asm块内定义的@test标签不会被注册为可被OFFSET识别的有效符号,编译阶段就会抛出未定义符号错误。
解决方法

直接按BCC32的内联汇编规则改写代码即可,不需要保留Delphi的汇编写法,需要调整的点如下:

  • 去掉标签的@前缀,使用普通合法标识符作为标签名
  • 把Delphi的asm...end块替换为C++ Builder支持的__asm {}块结构
  • BCC32内联汇编不支持db伪指令直接在代码流中插入字节,替换为_emit伪指令实现相同效果

适配后的可正常编译的代码示例:

void Test()
{
    __asm {
        MOV     EAX, OFFSET test_label
test_label:
        _emit 0x00
    }
}
额外注意事项
  • 如果担心自定义标签和其他全局符号重名,可以将Test函数声明为static,此时标签作用域会被限制在当前函数内,不会产生命名冲突
  • BCC32中@@开头的是供短跳转使用的临时局部标签,仅支持@B(向后引用最近的@@标签)、@F(向前引用最近的@@标签)做跳转操作,不支持用OFFSET取这类标签的地址,不要用这类标签实现原Delphi代码的逻辑

内容的提问来源于stack exchange,提问作者mcam77

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 18:54:27