如何计算GCC里内嵌汇编的大小
我要测量下某一段汇编代码的大小,比如占了多少字节。这段代码是内嵌在GCC的C文件里的。下面是一个例子:
extern char handler[], endhandler[]; /* C-code glue for the asm insert */
/* asm to "freeze" the processor - hey kiddies */
asm(
".data\n"
".code16\n"
".globl handler, endhandler\n"
"\n"
"handler:\n"
"nop\n"
"nop\n"
"nop\n"
"jmp handler\n"
"endhandler:\n"
"\n"
".text\n"
".code32\n"
);
int main(void) {
unsigned int ACPIBASE;
u8 smram_origvalue, smram_tmp;
u32 smi_en_io, smi_sts_io, smi_en_origvalue, smi_en_tmp;
int err;
。。。。。。。。。
}
我发现在编译的时候,GCC会产生一个临时的.S文件。但是在编译完后,这个文件似乎就被删除了。否则的话,我也许可以直接看看哪个.S文件占了多少字节。
不知道还有其他什么办法没有?最土的办法是让GCC产生个大的.S文件,然后自己数下中间的我需要的汇编部分占了多少字节。但是我的实际代码会比上面的例子复杂4,5倍。弄起来有点麻烦。
有更简单的方法么?多谢!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
gcc -S
在要确认的前后加上nop指令再自己数............
先感谢各位的回帖。
-S 可以产生汇编文件。但是产生出来的也是不带机器码的。和我自己写的汇编代码一样。所以不容易计算每条指令的长度。如果手工一条指令一条指令的去翻译的话,太慢了。
nop那个不是关键。我自己写的汇编,知道起始和截至。
objdump可以把一个binary翻译成汇编,同时带有机器码。但是我用它来处理我的2进制文件的时候,就找不到我自己写的汇编代码了。我怀疑是他按照32位来反汇编了。但是我要的是16位 的。
还有其他方法么?
[ 本帖最后由 accessory 于 2009-10-24 23:49 编辑 ]
搞定。
基本方法是把这段汇编代码单独编译成一个.s 文件。然后用gas. (命令是as file.s ) 编译下。得到a.out. 然后objdump -d. 就可以看到纯代码的大小了。
以前不知道用那个命令调用gas。所以一直没用这个方法。今天终于耐心的google. 然后看了下一本电子书的介绍 (其实也就花了几分钟)。
Ps:以前一直以为是用 gas 命令来启动。没想到真正的命令应该是 as. 真是人为的制造麻烦。
有个更方便的方法
.global _sizeofasm
.set _sizeofasm, endhandler-handler
c里面用
extern int sizeofasm;
来声明,之后就可以直接用sizeofasm在c里面使用了
谢LS,学习了。