2015-02-01 5 views
1

이 책을 읽는 중 프로그래밍 시작하기 지상에서 프로그래밍, Jonathan Bartlett. 처음에 함수 호출 규칙을 보여주는이 프로그램에서는 책 에서처럼 입력 한 후 실행하면 세그먼트 오류가 발생합니다. 이 함수는 스택에서 2 개의 숫자를 취하고 첫 번째 숫자를 % eax의 두 번째 숫자로 되돌립니다. 여기 x86 예제 프로그램의 세그먼트 오류

는 문제가되는 프로그램입니다 :

.code32 

.section .data 

.section .text 

.globl _start 
_start: 

    pushl $3 
    pushl $2 
    call power 
    addl $8, %esp 

    pushl %eax 

    pushl $2 
    pushl $5 
    call power 
    addl $8, %esp 

    popl %ebx 

    addl %eax, %ebx 

    movl $1, %eax 
    int $0x80 

.type power, @function 
power: 
    pushl %ebp 
    movl %esp, %ebp 
    subl $4, %esp 

    movl 8(%ebp), %ebx 
    movl 12(%ebp), %ecx 

    movl %ebx, -4(%ebp) 

power_loop: 
    cmpl $1, %ecx 
    je end_power 

    movl -4(%ebp), %eax 
    imull %ebx, %eax 
    movl %eax, -4(%ebp) 
    decl %ecx 

    jmp power_loop 

end_power: 
    movl -4(%ebp), %eax 
    movl %ebp, %esp 
    popl %ebp 
    ret 

나는 EDB에서 프로그램을로드하고 그것을 통해 강화, 나는 첫 번째 함수 인수를로드하는 명령에 도착하면 세그먼트 오류가 나타납니다.

0x000000003EC56208 주소에 액세스 할 수 없습니다.라는 오류 메시지가 표시됩니다.

함수 내에서 (8 + % ebp) 및 (12 + % ebp)가 가리키는 값에 액세스 할 수 없습니까?

+0

스택이 올바르게 설정되어 있는지 확인하십시오. 당신을 위해 준비가되어 있습니까? 어떤 어셈블러를 사용합니까? 어떻게 조립합니까? 어떻게 연결합니까? –

+0

나는 책에서 말하는 것처럼 'as'와 'ld'를 사용한다. 스택이 어떻게 설정되고 있는지 어떻게 알 수 있습니까? – Obrazi

답변

2

64 비트 운영 체제에서 32 비트 프로그램을 만들고 싶습니다.

as --32 -o power.o power.s 
ld -m elf_i386 -o power power.o 

실행을 ./power로 : 당신은 그 상황에 대한 어셈블러와 링커에게 있습니다.

+1

그 덕분에, 고마워! 나는 .code32 지시어가 그것을 말했다고 생각했다. – Obrazi