我正在尝试获取标签的地址 - 这里有一些示例代码:
int main() {
asm {
mov ax,1
mov bx,ax
}
_labelname:
asm {
mov ax, OFFSET _labelname
}
return 0;
}
此代码的编译会返回以下错误:“Undefined symbol _labelname” 如果我在asm块中定义标签,我甚至无法使用 jmp _labelname
答案 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位的东西???
除非它在一个片段中发生,否则你需要一个双重内存操作数才能找到_labelname
,dx:ax
等,如前所述,你已经晚了20年
jmp cs:_labelname
在同一段中工作但是对于更大的程序,cs部分需要是特定的段覆盖和远程跳/返回
此外,如果您的动态asm变量被压缩到您的asm代码段,那么最大化asm速度的基本规则已经被打破