2011-12-04 39 views
4

我试图得到一个标签的地址的地址 - 这里是一些示例代码:内联汇编使用C来的Turbo C 3.0 - 如何让一个标签

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根本没有帮助。有什么建议么?

+0

您是否尝试在实际的_asm块中设置标签? – Cyclonecode

+4

问了20年太晚了。请更新您的编译器。 –

+0

@Krister是的,试图在asm块中定义;它仍然不起作用。 – Mikael

回答

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; 
} 
+0

为什么会倒下投票? OP想要它,OP得到了它。 –

+0

你可能因为它不适用于Turbo C 3.0而被低估。我只是试了一下。 –

+0

它与Turbo C++ 1.01 + TASM一起工作。编译器通过TASM切换到编译。 3.0还应该有-B选项通过汇编程序进行编译,例如'tcc.exe -v -y -B lab.c'(-v和-y用于调试信息,以便可以检查TD中生成的.EXE文件。 EXE很容易)。 –

0

通常会有任何语言的路线,但你需要faff约一两天,因为这些东西并不总是被记录在内

声明一个全局内存操作空间在你的味道HLL。 DIM LABELNAME1(0)

然后搜索这使地址到EAX

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

然后弹出它在ASM

你不会找到pop [^对谷歌的任何地方ASM语法,但它是一个,这在某些工作高级语言

push eax 
pop [^LABELNAME1(0)] 

现在你HLL和ASM可以聊天对方,只要你喜欢

所以这是非常值得搞清楚


Undefined symbol _labelname 

Probbly需要在程序

._labelname 
mov dword [_lablename], 0 

最开始的声明,并通过ASM作为标签

以后使用正如我所说,你不得不瞎搞,为你的特定HLL味道而拼命,并且全球化似乎最有效果

您还需要弄清楚如何申报单独的内存区储存ASM动态变量和运行操作码,否则你会得到缓存覆盖,这将削弱ASM

一个小程序,我写的速度优势不分离这些区域需要20个小时才能运行。随着分离它耗时1小时


mov ax, OFFSET _labelname 

这是16位的东西,(DOS等,与愚蠢的记忆规则)不是你做的32位东西你HLL ???

除非这一切都在一个段发生的事情,你需要一个双存储操作数找到_labelnamedx:ax等,如前面提到的,你20年太晚

jmp cs:_labelname 

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

此外,如果您的动态asm变量插入到您的asm代码段中,那么用于最大化asm速度的基本规则已被破坏