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

section .bss 
bufNum:  resb 1 
bufMult: resb 1 

. . .Segfault доступ к памяти BSS

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' действительно загружает адрес (а не только смещение или содержимое переменной.) –

+0

mov ecx, bufChar переводит в mov $ 0x0,% ecx .... это действительно пытается переместить в 0x00000000? – Machinarius

+0

Мне нужно задаться вопросом ... это действительно нарушение * on * mov, или это то, что в настоящее время указывается инструкция EIP (которая, казалось бы, подразумевает системный вызов прямо перед ним)? – cHao

ответ

0

У пользователя есть шанс, что int 80h изменится на ecx или edx на вас, что вызывает плохой указатель? Если вы можете прочитать регистры в отладчике до и после этой инструкции, вы можете это подтвердить.

+0

'int 80h'" не должен "изменять любой регистр, кроме' eax' (результат или ошибка). 'bufChar' не отображается, поэтому мы не знаем, что это такое. 'bufNum' и' bufMult' резервируют один байт, и вы перемещаете в них 'eax' (4 байта). Это «вероятно» не будет segfault, но это неправильно! Покажите нам 'bufChar'. –

+0

Существуют системные вызовы, которые могут изменять больше регистров, но eax, например: waitpid - ждать завершения процессов. возвращаемые значения: eax \t pid готового процесса | ECHILD | EINVAL | ERESTART, ecx \t Состояние выхода готового процесса, если в ecx было введено ненулевое значение. – Farseer

0

Я объявил bufChar как .data, очевидно mov «В константу будет segfault вещь. К сожалению, я потратил неделю на то, чтобы обернуть мне голову, просто так понял.