我在C中初始化了数组,如下所示:

char buf[10]={0};

我在gdb中显示了它的程序集代码,它显示了:
char buf[10]={0};
0x0000000000400591 <+20>:    movq   $0x0,-0x20(%rbp)
0x0000000000400599 <+28>:    movw   $0x0,-0x18(%rbp)

我知道基于%rbp的偏移量是在分配空间,但我不知道movqmovw的含义是什么?似乎它不只是分配空间,初始化也同时进行但为什么偏移量是0x20或0x18?

最佳答案

这些指令不分配空间当它们被执行时,(堆栈上的)空间已经被分配了他们所做的就是用零初始化这个空间。
在您的平台上,局部变量存储在rbp的负偏移处数组中有10个字节,存储在-0x20的偏移量rbp处这个

movq   $0x0,-0x20(%rbp)

指令将buf的前8个字节设置为零(在q中为“四字”-movq)。这个
movw   $0x0,-0x18(%rbp)

指令将剩余的2字节buf设置为零(在w中为“word”-movw)。
注意-0x20 + 8-0x18这就是-0x18的来源。
      |----------------- buf -----------------|

    --+---+---+---+---+---+---+---+---+---+---+--     ---+---
...   | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |   ...    |   ...
    --+---+---+---+---+---+---+---+---+---+---+--     ---+---
      ^                               ^                  ^
      rbp - 0x20                      rbp - 0x18         rbp

                    zeroed              zeroed
                      by                  by
      |------------- mowq ------------|--movw-|

07-24 09:44
查看更多