我在C中初始化了数组,如下所示:
char buf[10]={0};
我在gdb中显示了它的程序集代码,它显示了:
char buf[10]={0};
0x0000000000400591 <+20>: movq $0x0,-0x20(%rbp)
0x0000000000400599 <+28>: movw $0x0,-0x18(%rbp)
我知道基于
%rbp
的偏移量是在分配空间,但我不知道movq
和movw
的含义是什么?似乎它不只是分配空间,初始化也同时进行但为什么偏移量是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-|