Segmentation Fault

1. Segmentation Fault

Alisson Cunha
alissonlcunha

(usa Ubuntu)

Enviado em 16/05/2017 - 17:08h

Olá pessoal,

Sou novato em assembly e estou com um probleminha aqui num problema de faculdade.

section .data
SYS_EXIT_PROGRAM equ 1
SYS_STANDARD_OUTPUT equ 1
SYS_STANDARD_INPUT equ 2
SYS_READ_FILE equ 3
SYS_WRITE_FILE equ 4
SYSTEM_CALL equ 0x80

;textos de exibicao para entrada do programa
TextoPedeCarta: db 'Informe a Carta: ',0
tamanhoTextoPedeCarta: equ $ - TextoPedeCarta
TextoPedeNaipe: db 'Informe o Naipe: ',0
tamanhoTextoPedeNaipe: equ $ - TextoPedeNaipe

;textos de exibicao para erros de entrada
TextoErroCarta: db 'Carta digitada inválida. [Digite uma carta entre 2,3,4,5,6,7,Q,J,K e A] ',13,10,0
tamanhoTextoErroCarta: equ $ - TextoErroCarta
TextoErroNaipe: db 'Naipe digitado inválido. [Digite P para Paus, C para Copas, E para Espadas e O para Ouros] ',13,10,0
tamanhoTextoErroNaipe: equ $ - TextoErroNaipe

QuebraLinha: db 13,10,0
tamanhoQuebraLinha: equ $ - QuebraLinha

arrayCartas db '2','3','4','5','6','7','Q','J','K','A'
arrayNaipes db 'P','C','E','O'

section .bss
cartaDigitada: resb 21
tamanhoCartaDigitada equ $ - cartaDigitada
naipeDigitado: resb 21
tamanhoNaipeDigitado: equ $ - naipeDigitado

CARTA: resb 4
NAIPE: resb 4

section .text
global _start

;Esta rotina pede uma carta e verifica se
; o valor é válido
; Entradas:
; ECX - texto complementar da carta
; EDX - tamanho do texto complementar
; EDI - ponteiro para o local onde a carta será colocada
Pede1Carta:

mov eax,SYS_WRITE_FILE
mov ebx,SYS_STANDARD_OUTPUT
mov ecx,TextoPedeCarta
mov edx,tamanhoTextoPedeCarta
int SYSTEM_CALL

mov eax,SYS_WRITE_FILE
mov ebx,SYS_STANDARD_OUTPUT
pop edx
pop ecx
; precisa guardar os valores para
; caso ocorra erro de digitação
push ecx
push edx
int SYSTEM_CALL

mov eax,SYS_READ_FILE
mov ebx,SYS_STANDARD_INPUT
mov ecx,cartaDigitada
mov edx,tamanhoCartaDigitada
int SYSTEM_CALL
call VerificaCarta

Pede1Naipe:
push edi
push ecx
push edx


mov eax,SYS_WRITE_FILE
mov ebx,SYS_STANDARD_OUTPUT
mov ecx,TextoPedeNaipe
mov edx,tamanhoTextoPedeNaipe
int SYSTEM_CALL

mov eax,SYS_WRITE_FILE
mov ebx,SYS_STANDARD_OUTPUT
pop edx
pop ecx
; precisa guardar os valores para
; caso ocorra erro de digitação
push ecx
push edx
int SYSTEM_CALL

mov eax,SYS_READ_FILE
mov ebx,SYS_STANDARD_INPUT
mov ecx,naipeDigitado
mov edx,tamanhoNaipeDigitado
int SYSTEM_CALL


VerificaCarta:
mov eax,10
mov ecx, arrayCartas
call loop

loop:
mov ebx,[cartaDigitada]
cmp [ebx],ecx
add ecx,1
jz Pede1Carta
dec eax
jnz loop

CartaIncorreta:
mov eax,SYS_WRITE_FILE
mov ebx,SYS_STANDARD_OUTPUT
mov ecx,TextoErroCarta
mov edx,tamanhoTextoErroCarta
int SYSTEM_CALL

jmp Pede1Carta

CartaCorreta:
mov eax,[cartaDigitada]
mov [CARTA],eax
ret

_start:
call Pede1Carta
call Pede1Naipe

mov eax,SYS_EXIT_PROGRAM
mov ebx,0
int SYSTEM_CALL


O programa basicamente é um tutor de truco. Estou no começo ainda tentando validar as cartas. Após entrar qualquer carta, tenho um segmentation fault. Algúem consegue me ajudar o porque??





  






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts