免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2272 | 回复: 7
打印 上一主题 下一主题

如何计算GCC里内嵌汇编的大小 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-10-24 00:45 |只看该作者 |倒序浏览
我要测量下某一段汇编代码的大小,比如占了多少字节。这段代码是内嵌在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倍。弄起来有点麻烦。

有更简单的方法么?多谢!

论坛徽章:
0
2 [报告]
发表于 2009-10-24 11:38 |只看该作者
gcc -S

论坛徽章:
0
3 [报告]
发表于 2009-10-24 14:19 |只看该作者
在要确认的前后加上nop指令再自己数............

论坛徽章:
0
4 [报告]
发表于 2009-10-24 16:51 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
5 [报告]
发表于 2009-10-24 23:45 |只看该作者
先感谢各位的回帖。

-S 可以产生汇编文件。但是产生出来的也是不带机器码的。和我自己写的汇编代码一样。所以不容易计算每条指令的长度。如果手工一条指令一条指令的去翻译的话,太慢了。

nop那个不是关键。我自己写的汇编,知道起始和截至。

objdump可以把一个binary翻译成汇编,同时带有机器码。但是我用它来处理我的2进制文件的时候,就找不到我自己写的汇编代码了。我怀疑是他按照32位来反汇编了。但是我要的是16位 的。

还有其他方法么?

[ 本帖最后由 accessory 于 2009-10-24 23:49 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-10-25 00:21 |只看该作者
搞定。

基本方法是把这段汇编代码单独编译成一个.s 文件。然后用gas.  (命令是as file.s ) 编译下。得到a.out. 然后objdump -d.  就可以看到纯代码的大小了。

以前不知道用那个命令调用gas。所以一直没用这个方法。今天终于耐心的google. 然后看了下一本电子书的介绍 (其实也就花了几分钟)。

Ps:以前一直以为是用 gas 命令来启动。没想到真正的命令应该是 as. 真是人为的制造麻烦。

论坛徽章:
0
7 [报告]
发表于 2009-10-26 16:36 |只看该作者
有个更方便的方法

.global _sizeofasm

.set _sizeofasm, endhandler-handler

c里面用

extern int sizeofasm;
来声明,之后就可以直接用sizeofasm在c里面使用了

论坛徽章:
0
8 [报告]
发表于 2009-10-26 23:49 |只看该作者
谢LS,学习了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP