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 в строке, отмеченной комментарием, и я не вижу, как я пытаюсь получить доступ к смещенной памяти ... любые идеи о том, как это может случиться?
Используйте 'objdump -d obj.o', чтобы убедиться, что' mov ecx, bufChar' действительно загружает адрес (а не только смещение или содержимое переменной.) –
mov ecx, bufChar переводит в mov $ 0x0,% ecx .... это действительно пытается переместить в 0x00000000? – Machinarius
Мне нужно задаться вопросом ... это действительно нарушение * on * mov, или это то, что в настоящее время указывается инструкция EIP (которая, казалось бы, подразумевает системный вызов прямо перед ним)? – cHao