在汇编中堆栈上的缓冲区

时间:2016-10-17 16:02:09

标签: assembly buffer

我有以下简单代码

holder.toggle.setChecked(search.get(position).isChecked())

它输出的组件是

反汇编.text:

   void test() {
        char buffer[20];
        return 0;
    }

    int main() {
        test();
    }

我猜测这个组件的缓冲区大小?堆栈看起来似乎并不多。

1 个答案:

答案 0 :(得分:0)

您可以使用https://godbolt.org/实时浏览C ++源代码的生成机器代码:
(我使用英特尔语法..如果关闭则切换,如果你想要AT& T)

void test() {
    char buffer[400];
    buffer[0] = 0;
    return;
}

编译为:

test():
    ; {
        push    rbp
        mov     rbp, rsp
        sub     rsp, 280    ; reserves more space at stack for local variables

    ; buffer[0] = 0;
        mov     BYTE PTR [rbp-400], 0

    ; return; .. sort of .. or just padding
        nop

    ; }
        leave
        ret

一个正确的C编译器不会试图“继续”很多,而是尝试用最少量的指令来实现C源的所有已定义/期望的行为......实际上我认为具有足够高的优化级别它将完全删除test()调用,因为它不会执行任何操作并且编译器知道它。

编辑:是的,使用-O3,gcc只会为整个rep ret生成test()。作品。 (rep用于较旧的AMD CPU,当单ret跟随某些条件分支跳转后,不会阻塞预取队列...您可以将其视为简单ret,它只是额外的垃圾字节到make ret 2字节操作码。