在初始化C中的数组中,`movq`和`movw`是什么意思?

nai*_*231 1 c assembly

我在C中初始化数组是这样的:

char buf[10]={0};
Run Code Online (Sandbox Code Playgroud)

我在gdb中显示其汇编代码,它显示:

char buf[10]={0};
0x0000000000400591 <+20>:    movq   $0x0,-0x20(%rbp)
0x0000000000400599 <+28>:    movw   $0x0,-0x18(%rbp)
Run Code Online (Sandbox Code Playgroud)

我知道偏移基础%rbp是分配空间,但我不知道是什么意思movqmovw?似乎它不仅仅分配空间,初始化也同时完成.但为什么偏移量是0x20或0x18?

AnT*_*AnT 8

这些说明不分配空间.当它们被执行时,已经分配了空间(在堆栈上).他们所做的只是用零初始化该空间.

在您的平台上,局部变量存储在负偏移处rbp.您的数组中包含10个字节,并存储在偏移量-0x20rbp.该

movq   $0x0,-0x20(%rbp)
Run Code Online (Sandbox Code Playgroud)

指令将前8个字节buf设置为零("四字" - q输入movq).该

movw   $0x0,-0x18(%rbp)
Run Code Online (Sandbox Code Playgroud)

指令将剩余的2个字节buf设置为零("字" - w输入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-|
Run Code Online (Sandbox Code Playgroud)