GAS汇编程序分段错误(写入自动变量)

时间:2017-08-24 09:02:18

标签: c linux assembly x86

我打算用C:

这样做
#include<stdio.h>
int main() {
  int arr[5];
  arr[0] = 5;
  arr[1] = 0;
  arr[2] = 1;
  arr[3] = 3;
  arr[4] = 4;
  int max = 0;
  for(int i = 0;i < 5;i++)
    if(max < arr[i])
      max = arr[i];
  printf("%d\n", max);
  return 0;
}

这是我的代码链接:array_max.s。这是AT&amp; T格式的汇编代码:

.data

.text
.globl _start
_start:
  movl $5, -20(%ebp)
  movl $0, -16(%ebp)
  movl $1, -12(%ebp)
  movl $3, -8(%ebp)
  movl $4, -4(%ebp)
  movl $0, %ecx
  movl $5, %eax
  loop:
    cmp $0, %eax
    je terminate
    cmp %ecx, -20(%ebp,%eax,4)
    jg assign
    jmp loop


terminate:
  movl $4, %eax
  movl $1, %ebx
  movl $1, %edx
  int $0x80
  movl $1, %eax
  int $0x80
  ret

assign:
  movl -20(%ebp,%eax,4), %ecx
  ret

我在第一条指令movl $5, -20(%ebp)上遇到了分段错误。我是新手,请帮忙。

1 个答案:

答案 0 :(得分:5)

  

我在第一条指令movl $5, -20(%ebp)上遇到了分段错误。

您没有在arr(即int arr[5])的堆栈上分配任何空间:

pushl %ebp
movl %esp, %ebp
subl $20,%esp //<--- memory allocation

要通过恢复先前的堆栈帧来释放堆栈上分配的内存,请使用leave之前的ret指令。