section .data
bufChar: equ 0
section .bss
bufNum: resb 1
bufMult: resb 1
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'가 실제 오프셋 (offset)이나 변수의 내용이 아닌 주소를로드하는지 확인하십시오. –
mov ecx, bufChar는 mov로 변환됩니다. $ 0x0, % ecx .... 실제로 0x00000000으로 이동하려고합니까? – Machinarius
내가 궁금해 할 점은 ... * 실제로 mov를 깨거나 * EIP가 현재 지시하고있는 지시 사항 (바로 전에 시스템 호출과 연관되어있는 것처럼 보입니다)입니까? – cHao