2
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。

我在标有注释的行上有一个神秘的段错误,我看不到我是如何尝试访问未对齐的内存的……关于这怎么可能失败的任何想法?

4

2 回答 2

0

我已经将 bufChar 声明为 .data,很明显,mov'ing 成一个常数会使事情发生段错误。可悲的是,我浪费了一周的时间来解决这个问题,我才意识到这一点。

于 2013-05-01T19:51:35.080 回答
0

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

于 2013-05-01T18:02:33.923 回答