2014-07-23 4 views
0

내가 메모리에 임시 변수를 저장하여 3을 반환하려고 간단한 조립 프로그램이 있습니다% ebp의 초기 값은 무엇입니까?

$ as out.s -o out.o 
$ ld -s -o out out.o 
$ ./out 
segmentation fault 

내 생각 : 그러나

.text 
    .global _start 

_start: 
    movl $2, %ebx 
    mov  %ebx, -0x4(%ebp) 
    movl $1, %ebx 
    add  -0x4(%ebp), %ebx 
    movl $1, %eax 
    int  $0x80 

을, 이것은 내가 그것을 실행할 때 나에게 세그먼트 오류를 ​​제공합니다 이것은 결코 초기화하지 않기 때문입니다 %ebp. 레지스터를 사용하고 %ebp을 기준으로 메인 메모리에 액세스하지 않으면 프로그램이 정상적으로 실행됩니다.

초기화 할 값은 무엇입니까? 시작시 프로그램 malloc 자체 스택을 사용해야합니까?

프로그램 시작에

답변

5

%esp 레지스터는 당신의 스택의 상단 (가 아래로 성장 기억)로 초기화되지만 %ebp는 초기화되지 않습니다. 그래서 당신은 그렇게해야합니다.

_start: 
    movl  %esp, %ebp 
    subl  $4, %esp 
    ... rest of your code 

이 오프셋 -4(%ebp) 액세스 지역 변수, 4 바이트를가집니다.

+0

실제로 모든 함수가'% ebp'를 프레임 포인터로 사용하고 있다면, 그것은 이전 프레임으로 초기화 될 것입니다. 그러나 그것은 가정 일 것입니다. 8-) –

+0

이것은 여전히 ​​segfaults입니다. 'movl % esp, % ebp''subl $ 4, % esp''movl % ebx, -4 (% ebp)'그게 전부일까요? –

+0

어떤 명령에서 코드 세분화가 정확히 이루어지며 그 당시 관련 레지스터의 값은 무엇입니까? –