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

int 80h変化している可能性、ecxまたはedxポインターの読み取り不良を引き起こしている可能性はありますか? その命令の前後にデバッガでレジスタを読み取ることができれば、それを確認できます。

于 2013-05-01T18:02:33.923 に答える
0

私は bufChar を .data として宣言しましmovた。悲しいことに、私はこれに頭を悩ませて 1 週間を無駄にしました。

于 2013-05-01T19:51:35.080 に答える