Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [ASSEMBLY] Errore

  1. #1
    Utente di HTML.it L'avatar di provasp
    Registrato dal
    Sep 2002
    Messaggi
    160

    [ASSEMBLY] Errore

    Questo listato ASM converte una stringa ASCII in un numero intero.
    Ho questo problema: all'etichetta "negativo", se io elimino il comando "movl $1, nega" il programma funziona correttamente, ma se includo questo comando il programma non va bene. Ovviamente a me serve che il comando sia applicato.

    Grazie.


    codice:
    .section .data
    
    car:	.byte 0
    nega:   .long 0
    
    .section .text
    .global atoi
    
    .type atoi, @function 
    
    atoi:
    
      	pushl %ebx 
      	pushl %ecx  
      	pushl %edx  
    
      	xorl %eax, %eax
      	jmp inizio
    
    inizio:
    
      	pushl %eax
    
      	movl  $3, %eax
      	xorl  %ebx, %ebx 
      	leal  car, %ecx 
    
      	mov   $1, %edx 
      	int   $0x80 
      	cmp   $10, car      	# se e' stato letto il carattere '\n'
      	je    fine_ciclo
    
      	cmp   $45, car      	# se e' stato letto il carattere '-'
      	je    negativo
    
      	subb  $48, car      	# converte il codice ASCII della cifra nel numero corrisp.
      	popl  %eax
      	movl  $10, %ebx
      	mull  %ebx 
    
      	addl  car, %eax
      	jmp   inizio
    
    negativo:
    	movl $1, nega
      	popl %eax
      	jmp inizio
    
    fine_ciclo:
      	cmp $0, nega
      	je non_negativo	
    
      	popl %eax
      	neg %eax
      	jmp fine
    
    non_negativo:
      	popl %eax
    
    fine:
      	popl %edx
      	popl %ecx 
      	popl %ebx
    
      	ret

  2. #2
    Utente di HTML.it L'avatar di cso
    Registrato dal
    Aug 2004
    Messaggi
    2,050
    hai provato "movl $01, nega"???

  3. #3
    ho riscritto il codice e l'ho verificato...

    codice:
      ; Prototipo:        int atoi ( char* numericValue );
      ; Descrizione:      converte una stringa numerica decimale in un intero con segno
      ; Valori accettati: ^\s*(+|-|)[0-9]*
      ; Esempi validi:    +8532, -731, 32642, 000423, 40gatti, -600nonne
      ;
      ; Attenzione:       controllo overflow non implementato
    
      atoi:
    	push	esi
    	mov	esi, dword ptr ss:[esp+8]
    
    	xor	eax, eax
    	xor	ecx, ecx
    	xor	edx, edx
    
    	cld
    
      _lTrimString:
    	lodsb
    
    	cmp	al, ' '
    	je	_lTrimString
    	cmp	al, '	'
    	je	_lTrimString
    
    
    	cmp	al, '-'
    	jne	_notNegative
    
    	or	ecx, 1
    	jmp	_getNextDigit
    
      _notNegative:
    	cmp	al, '+'
    	je	_getNextDigit
    
      _parseNextDigit:
    	sub	al, '0'
    	cmp	al, 9
    	ja	_gotNumber
    
    	push	eax
    	mov	eax, edx
    
    	shl	edx, 3
    
    	add	edx, eax
    	add	edx, eax
    
    	pop	eax
    	add	edx, eax
    
      _getNextDigit:
    	lodsb
    	jmp	_parseNextDigit
    
    
      _gotNumber:
    	test	ecx, 1
    	jz	_dontAdjust
    
    	neg	edx
    
      _dontAdjust:
    	mov	eax, edx
    
    	pop	esi
    	retn	4
    se ti puo' servire...
    DYNAMIC+ [ E-mail ]

    Secondo me non si può fare!

  4. #4
    Utente di HTML.it L'avatar di cso
    Registrato dal
    Aug 2004
    Messaggi
    2,050
    'spe, secondo me è un bug.

    questo dovrebbe funzionare quasi sicuramente:
    codice:
    movl $0x01, nega
    tanto uno in decimale è uguale a uno in hex.

  5. #5
    Utente di HTML.it L'avatar di provasp
    Registrato dal
    Sep 2002
    Messaggi
    160
    Vi ringrazio tutti, ho risolto cambiando il nome alla variabile "nega" e riscrivendo le istruzioni all'etichetta negativo nello stesso identico modo di com'erano prima...
    Non so proprio cosa possa essere successo . E pensare che mi ha fatto tribulare per un'intera serata...
    Stasse comunque dò un'occhiata ai vostri consigli e vedo di capirci qualcosa


    MOLTE GRAZIE!!!

  6. #6

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.