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。
我在标有评论的行上有一个神秘的段错误,我没有看到我如何试图访问未对齐的记忆......任何关于如何失败的想法?
答案 0 :(得分:0)
int 80h
是否有可能导致错误指针读取ecx
或edx
?如果您可以在该指令之前和之后读取调试器中的寄存器,则可以确认。
答案 1 :(得分:0)
我已经将bufChar声明为.data,显然mov
进入常量会使该事件发生错误。可悲的是,我浪费了一个星期的时间围绕着这个,只是意识到这一点。