相关疑难解决方法(0)

了解堆栈分配和对齐

我试图理解堆栈对齐是如何工作的,如什么是"堆栈对齐"?但我很难得到一个小例子来证明上述行为.我正在检查我的函数foo的堆栈分配:

void foo() {
    int a = 0;
    char b[16];
    b[0] = 'a';
}
Run Code Online (Sandbox Code Playgroud)

我编译了源文件gcc -ggdb example.c -o example.out(即没有任何编译器标志),并且gdb中的汇编器转储读取:

(gdb) disassemble foo
Dump of assembler code for function foo:
0x08048394 <+0>:    push   %ebp
0x08048395 <+1>:    mov    %esp,%ebp
0x08048397 <+3>:    sub    $0x20,%esp
0x0804839a <+6>:    movl   $0x0,-0x4(%ebp)
0x080483a1 <+13>:   movb   $0x61,-0x14(%ebp)
0x080483a5 <+17>:   leave  
0x080483a6 <+18>:   ret    
End of assembler dump.
Run Code Online (Sandbox Code Playgroud)

我的堆栈以16字节的块分配(我通过其他几个测试验证了这一点).根据汇编程序转储,这里分配了32个字节,因为(16 <4 + 16 <32),但我希望在前16个字节上分配整数'a',然后在接下来的16个字节上分配字符数组(在中间留下12个字节的空间).但似乎整数和字符数组都被分配了一个20字节的连续块,根据我上面提到的讨论,这是低效的.有人可以解释我在这里缺少的东西吗?

编辑:我得出结论,我的堆栈分配16个字节的块,使用如下程序:

void foo() {
    char a[1];
}
Run Code Online (Sandbox Code Playgroud)

和相应的汇编程序转储:

(gdb) disassemble foo …
Run Code Online (Sandbox Code Playgroud)

c stack memory-management memory-alignment

7
推荐指数
1
解决办法
5311
查看次数

为什么我的堆栈指针只增加16的倍数?

使用以下C代码

void func() {
  int a=1,b=2,c=3;
}
Run Code Online (Sandbox Code Playgroud)

使用gcc -S -O -o- myfile.c我得到输出进行编译

    .file   "myfile.c"
    .intel_syntax noprefix
    .text
.globl func
    .type   func, @function
func:
    push    ebp
    mov ebp, esp
    sub esp, 16
    mov DWORD PTR [ebp-4], 1
    mov DWORD PTR [ebp-8], 2
    mov DWORD PTR [ebp-12], 3
    mov DWORD PTR [ebp-16], 4
    mov DWORD PTR [ebp-20], 5
    leave
    ret
    .size   func, .-func
    .ident  "GCC: (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5"
    .section    .note.GNU-stack,"",@progbits
Run Code Online (Sandbox Code Playgroud)

在这里我希望之后的第三行func:sub esp,12不是sub esp,16.我在函数中使用了不同数量的自动变量,发现它以16字节为增量增长.为什么会这样?这是在所有平台上发生,还是特定于平台?

我目前正在使用OSX运行Intel …

x86 assembly

5
推荐指数
1
解决办法
464
查看次数

为什么System V/AMD64 ABI要求16字节堆栈对齐?

我读过的,因为它是为"业绩原因"做不同的地方,但我仍然不知道什么是在性能得到这个16字节对齐提高了特殊情况.或者,无论如何,选择这个的原因是什么.

编辑:我想我以误导的方式写了这个问题.我没有询问为什么处理器使用16字节对齐的内存更快地处理事情,这在文档中随处可见.我想要知道的是,强制执行16字节对齐比仅让程序员在需要时自己对齐堆栈更好.我问这个是因为根据我的汇编经验,堆栈实施有两个问题:只有少于1%的执行代码才有用(所以其他99%实际上是开销); 它也是一个非常常见的错误来源.所以我想知道它最终是如何得到回报的.虽然我对此仍有疑问,但我接受了彼得的回答,因为它包含了我原来问题的最详细答案.

assembly x86-64 abi

5
推荐指数
1
解决办法
1144
查看次数

堆栈(内存段)是否总是连续保存变量?

假设我正在编写一个C程序,它具有:

int a = 1;
int b = 5;
int *p = &a;
Run Code Online (Sandbox Code Playgroud)

将:

int k = *(p+1);
Run Code Online (Sandbox Code Playgroud)

总是给k = 5


形式上:

这个变量'地址的"连续"属性是否依赖于堆栈实现?如果没有,是否有保证(例如&a < &b < &p)?

(这个在ubuntu上使用gcc的简单测试给出了k=5,但涉及不同类型的其他测试不起作用)

c memory-management

1
推荐指数
1
解决办法
129
查看次数

标签 统计

assembly ×2

c ×2

memory-management ×2

abi ×1

memory-alignment ×1

stack ×1

x86 ×1

x86-64 ×1