Ir ao conteúdo
  • Cadastre-se

Segmentation Fault em Assembly


Posts recomendados

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. O programa compila e roda, mas após entrar qualquer carta, tenho um segmentation fault. Algúem consegue me ajudar o porque??

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...