基本上,我试图找到一种可靠的方法来获取 C 函数的字节长度。
一些人建议使用函数的地址和紧随其后的另一个函数的地址。我不想使用这种方法,因为我不相信它是可靠的。编译器可以移动东西,它看起来有点hack-ish。
我想出的解决方案是在函数的开头和结尾使用两个标签。我已经声明了标签:
__asm__ __volatile__("func_start/end:");
现在,我的问题是,我无法将这些标签的地址放回 C 中的变量中。
这是我已经尝试过的一些代码:
unsigned int addr, len;
__asm__ __volatile__("mov $func_start, %[address]\n\t"\
"mov $func_end, %[length]\n\t"\
: [address]"=r"(addr), [length]"=r"(len));
__asm__ __volatile__("mov %0, $func_start \n\t"\
"mov %1, $func_end\n\t"\
: "=r"(addr), "=r"(len));
这两个示例在编译期间都给出了错误“ARM register expected”。由于我对 ARM 汇编(更不用说 x86)不是很有经验,所以我不确定出了什么问题。我尝试将以下 x86 代码移植到 ARM:
__asm__ __volatile__("movl $enc_start, %0\n\t"\
"movl $enc_end, %1\n\t"\
: "=r"(addr), "=r"(len));
我显然在这里做错了什么。如果有人能解释我做错了什么,我将不胜感激。我已经坚持了几个星期了。谢谢!