이 책을 읽는 중 프로그래밍 시작하기 지상에서 프로그래밍, 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)가 가리키는 값에 액세스 할 수 없습니까?
스택이 올바르게 설정되어 있는지 확인하십시오. 당신을 위해 준비가되어 있습니까? 어떤 어셈블러를 사용합니까? 어떻게 조립합니까? 어떻게 연결합니까? –
나는 책에서 말하는 것처럼 'as'와 'ld'를 사용한다. 스택이 어떻게 설정되고 있는지 어떻게 알 수 있습니까? – Obrazi