Segfault访问BSS内存

时间:2013-05-01 17:52:26

标签: linux assembly nasm

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。

我在标有评论的行上有一个神秘的段错误,我没有看到我如何试图访问未对齐的记忆......任何关于如何失败的想法?

2 个答案:

答案 0 :(得分:0)

int 80h是否有可能导致错误指针读取ecxedx?如果您可以在该指令之前和之后读取调试器中的寄存器,则可以确认。

答案 1 :(得分:0)

我已经将bufChar声明为.data,显然mov进入常量会使该事件发生错误。可悲的是,我浪费了一个星期的时间围绕着这个,只是意识到这一点。