使用Turbo C 3.0在C中进行内联汇编 - 如何获取标签的地址

时间:2011-12-04 14:47:20

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

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

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

    return 0;
}

此代码的编译会返回以下错误:“Undefined symbol _labelname” 如果我在asm块中定义标签,我甚至无法使用      jmp _labelname

我找到this并且对this无效,实际上没有办法。 This说只是跳,而不是说。而this根本没有帮助。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

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

int main(void)
{
    asm {
        mov ax,1
        mov bx,ax
    }

    asm { _labelname: }

    asm {
        mov ax, OFFSET _labelname
        jmp cs:_labelname
    }

    return 0;
}

答案 1 :(得分:0)

通常使用任何语言的路线,但是你需要做一两天,因为这些事情并不总是记录在案

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

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

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

然后在asm中弹出

你不会在谷歌的任何地方找到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速度的基本规则已经被打破