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读取一个数字。
我在标记为注释的行处有一个神秘的段错误,我无法看到我是如何尝试访问未对齐的内存......关于如何失败的任何想法?
使用'objdump -d obj.o'来验证'mov ecx,bufChar'确实加载了地址(而不仅仅是偏移量或变量的内容。) – 2013-05-01 18:31:08
mov ecx,bufChar正在转换为mov $ 0x0,%ecx ....是否真的试图进入0x00000000? – Machinarius 2013-05-01 19:44:49
我不得不怀疑......它实际上是否打破了mov,或者是EIP目前指向的指令(这似乎牵涉到系统调用之前)? – cHao 2013-05-01 19:53:52