2013-05-01 2 views
1
section .data 
    bufChar: equ 0 

section .bss 
bufNum:  resb 1 
bufMult: resb 1 

. . .BSS 메모리에 액세스하는 Segfault

leerNumero: 
    xor eax,eax 
    mov [bufNum],eax 
    add eax,1 
    mov [bufMult],eax 
inicioLeerNumero: 
    mov edx,1 
    mov ecx,bufChar 
    mov ebx,0 
    mov eax,3 
    int 80h 
    cmp byte [ecx + edx - 1],10 ; Segfaults here. 
    je rLeerNumero 
    cmp byte [ecx + edx - 1],48 
    jl noNumero 
    cmp byte [ecx + edx - 1],57 
    jg noNumero 
    sub eax,48 
    mul word [bufMult] 
    jo overflow 
    add [bufNum],eax 
    jo overflow 
    mov eax,10 
    mul word [bufMult] 
    jo overflow 
    mov [bufMult],eax 
    jmp inicioLeerNumero 
rLeerNumero: 
    mov eax,bufNum 
    ret 
noNumero: 
    mov eax,errorNumero 
    mov ebx,lErrorNumero 
    call imprimir 
    jmp salir 
overflow: 
    mov eax,errorOverflow 
    mov ebx,lErrorOverflow 
    call imprimir 
    jmp salir 

이 코드 작업 해야는, 적어도 논문에서 그렇습니다. C 라이브러리를 연결하지 않고 어셈블리에서 숙제를 완전히해야하기 때문에 콘솔에서 EAX로 숫자를 읽는 방법을 다시 만들었습니다.

나는 주석으로 표시된 줄에 신비한 segfault가 있는데 어떻게 잘못 정렬 된 메모리에 액세스하려고하는지 알 수 없다 ... 어떻게 실패 할 수 있는지에 대한 아이디어가 있습니까?

+0

'objdump -d obj.o'를 사용하여'mov ecx, bufChar'가 실제 오프셋 (offset)이나 변수의 내용이 아닌 주소를로드하는지 확인하십시오. –

+0

mov ecx, bufChar는 mov로 변환됩니다. $ 0x0, % ecx .... 실제로 0x00000000으로 이동하려고합니까? – Machinarius

+0

내가 궁금해 할 점은 ... * 실제로 mov를 깨거나 * EIP가 현재 지시하고있는 지시 사항 (바로 전에 시스템 호출과 연관되어있는 것처럼 보입니다)입니까? – cHao

답변

0

int 80hecx 또는 edx으로 바뀌면 잘못된 포인터가 읽힐 수 있습니다. 해당 명령어의 전후에 디버거의 레지스터를 읽을 수 있다면이를 확인할 수 있습니다.

+0

'int 80h' "는"레지스터를 수정해서는 안되지만'eax' (결과 또는 에러). 'bufChar'는 보여지지 않으므로 우리는 그것이 무엇인지 알지 못합니다. 'bufNum'과'bufMult'는 각각 하나의 바이트를 예약하고,'eax' (4 바이트)를 그들로 옮깁니다. 이 "아마도"segfault되지 않습니다,하지만 그것은 잘못입니다! 'bufChar'를 보여주세요. –

+0

더 많은 레지스터를 변경할 수있는 시스템 호출이 있지만 예를 들면 다음과 같습니다. waitpid - 프로세스가 종료 될 때까지 대기합니다. 반환 값은 다음과 같습니다. eax \t 프로세스 종료 | ECHILD | EINVAL | ERESTART, ecx \t 종료 프로세스의 종료 상태. ecx에 0이 아닌 값이 입력 된 경우. – Farseer

0

나는 bufChar를 .data로 선언했는데, 분명히 mov이 상수로 들어가면 그 일이 segfault됩니다. 슬프게도, 나는 이것에 대해 머리를 감싸는 1 주일을 낭비했다.