我在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是分配空间,但我不知道是什么意思movq和movw?似乎它不仅仅分配空间,初始化也同时完成.但为什么偏移量是0x20或0x18?
这些说明不分配空间.当它们被执行时,已经分配了空间(在堆栈上).他们所做的只是用零初始化该空间.
在您的平台上,局部变量存储在负偏移处rbp.您的数组中包含10个字节,并存储在偏移量-0x20处rbp.该
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)