我正在尝试获取标签的地址 - 这是一些示例代码:
int main() {
asm {
mov ax,1
mov bx,ax
}
_labelname:
asm {
mov ax, OFFSET _labelname
}
return 0;
}
编译此代码返回此错误:“未定义符号 _labelname”如果我在 asm 块中定义标签,我什至不能使用 jmp _labelname
通常有任何语言的路线,但您需要花一两天时间,因为这些事情并不总是记录在案
以您的 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 位的东西吗???
除非这一切都发生在一个段中,否则您将需要一个双内存操作数来查找_labelname
等dx:ax
,并且如前所述,您已经晚了 20 年
jmp cs:_labelname
在同一段中工作,但对于更大的程序,cs 部分需要是特定的段覆盖和远跳转/返回
此外,如果你的动态 asm 变量被插入到你的 asm 代码段中,那么最大化 asm 速度的基本规则就被打破了
我找到了一种方法,但你不能使用 C 标签,它必须是 asm 标签:
int main(void)
{
asm {
mov ax,1
mov bx,ax
}
asm { _labelname: }
asm {
mov ax, OFFSET _labelname
jmp cs:_labelname
}
return 0;
}