【问题标题】:Inline assembly in C with Turbo C 3.0 - how to get address of a label带有 Turbo C 3.0 的 C 中的内联汇编 - 如何获取标签的地址
【发布时间】:2012-01-12 15:34:42
【问题描述】:

我正在尝试获取标签的地址 - 这是一些示例代码:

int main() {
    asm {
        mov ax,1
        mov bx,ax
    }
  _labelname:
    asm {
        mov ax, OFFSET _labelname
    }

    return 0;
}

此代码的编译返回此错误:“未定义符号 _labelname” 如果我在 asm 块中定义标签,我什至不能使用 jmp _labelname

我找到了this 并不起作用,对于this,实际上不可能。 This 说只是跳跃,而不是寻址。而this 根本没有帮助。有什么建议吗?

【问题讨论】:

  • 您是否尝试在实际的_asm 块内设置标签?
  • 问得太晚了 20 年。请更新您的编译器。
  • @Krister 是的,尝试在 asm 块中定义;还是不行。

标签: c assembly label inline-assembly turbo-c


【解决方案1】:

通常有任何语言的路线,但您需要花一两天时间,因为这些事情并不总是记录在案

以您的 HLL 风格声明一个全局内存操作空间。 DIM LABELNAME1(0)

然后搜索将地址放入eax的asm语法

mov eax, ^LABELNAME(0)
mov eax, dword [_lablename]
mov eax, ^_lablename
etc etc etc

然后在 asm 中弹出

您在 google 上的任何地方都找不到pop [^,但它适用于某些 HLL

push eax
pop [^LABELNAME1(0)]

现在您的 HLL 和 asm 可以随时互相聊天

所以值得一试


Undefined symbol _labelname

可能需要在程序一开始就声明

._labelname
mov dword [_lablename], 0

后来被asm用作标签

正如我所说,您将不得不为自己的 HLL 特殊风格搞砸并搞砸,而全局变量似乎效果最好

您还需要弄清楚如何声明单独的内存区域以存储 asm 动态变量和运行操作码,否则您将获得缓存覆盖,这将削弱 asm 的速度优势

我编写的一个没有分离这些 asm 区域的小例程需要 20 个小时才能运行。分开用了1个小时


mov ax, OFFSET _labelname

这是 16 位的东西,(DOS 等,具有愚蠢的内存规则)你不是用你的 HLL 做 32 位的东西吗???

除非这一切都发生在一个段中,否则您将需要一个双内存操作数来查找 _labelnamedx:ax 等,如前所述,您已经晚了 20 年

jmp cs:_labelname

在同一段中工作,但对于更大的程序,cs 部分需要是特定的段覆盖和远跳转/返回

另外,如果你的动态 asm 变量被插入到你的 asm 代码段中,那么最大化 asm 速度的基本规则就被打破了

【讨论】:

    【解决方案2】:

    我找到了一种方法,但是你不能使用 C 标签,它必须是 asm 标签:

    int main(void)
    {
        asm {
            mov ax,1
            mov bx,ax
        }
    
        asm { _labelname: }
    
        asm {
            mov ax, OFFSET _labelname
            jmp cs:_labelname
        }
    
        return 0;
    }
    

    【讨论】:

    • 为什么要投反对票? OP想要它,OP得到它。
    • 您被否决可能是因为它不适用于 Turbo C 3.0。我刚试过。
    • 它确实适用于 Turbo C++ 1.01 + TASM。编译器切换到通过 TASM 编译。 3.0 还应该有 -B 选项以通过汇编程序编译,例如tcc.exe -v -y -B lab.c(-v 和 -y 用于调试信息,因此可以轻松检查 TD.EXE 中的结果 .EXE)。
    猜你喜欢
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 2011-06-09
    • 2013-11-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多