4

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

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

    return 0;
}

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

我发现了这个并且不起作用,为此,实际上没有办法。说只是跳跃,而不是寻址。这根本没有帮助。有什么建议么?

4

2 回答 2

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 速度的基本规则就被打破了

于 2013-06-22T08:38:19.053 回答
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;
}
于 2011-12-04T15:18:51.783 回答