如何计算GCC里内嵌汇编的大小

发布于 2022-09-18 04:32:41 字数 1611 浏览 16 评论 0

我要测量下某一段汇编代码的大小,比如占了多少字节。这段代码是内嵌在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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(6

梦屿孤独相伴 2022-09-25 04:32:41

在要确认的前后加上nop指令再自己数............

撕心裂肺的伤痛 2022-09-25 04:32:41

先感谢各位的回帖。

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

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

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

还有其他方法么?

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

十级心震 2022-09-25 04:32:41

搞定。

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

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

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

菩提树下叶撕阳。 2022-09-25 04:32:41

有个更方便的方法

.global _sizeofasm

.set _sizeofasm, endhandler-handler

c里面用

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

仙女山的月亮 2022-09-25 04:32:41

谢LS,学习了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文