Assembly 32bit – compare char

I have a C program that calls a function written in 32bit assembly which check if the input is a character or a number, then return 1 else return 0.
I’ve done something wrong because the comparison return to me always the same result.

Here the C code:

#include <stdio.h>
#include <stdlib.h>

int aisalnum(int *ascii);

//char atoupper(char *a);
//char astripnoalnum(char str[]);

int main(int argc, char **argv)
{
  char input;
  int a;
  printf("nPremi un tasto: ");
  scanf("%c",&input);

  a = (int)(input);

  int result = aisalnum(&a);
//  printf("nAssembly ritorna: %d",result);
  if(result == 1)
    {
      printf("nIl carattere e' una lettera o un numeron");
    }else{
      printf("nnIl carattere non e' ne lettera ne numeron");
    }

  return 0;
}

And here the assembly function:

extern printf

global aisalnum
global atoupper
global astripnoalnum

;----------------------------------------------; 
;La funzione riceve un parametro;
;verifica se è una lettera o un numero;
;e ritorna 1, altrimenti ritorna 0;
;----------------------------------------------;

aisalnum:
    PUSH    EBP     ;salvo ebp
    MOV EBP,ESP     ;carico lo stack pointer nel base pointer

    XOR EBX,EBX     ;azzero il registro nel quale poi
    MOV EBX,[EBP+8] ;recupero il parametro inserito
    PUSH    EBX
    CALL    printf
    POP EAX

    CMP EBX,48      ;verifico se il carattere ottenuto è maggiore di 48(zero)
    JAE up_o        ;e salto a up_o (up of zero);
    JMP none        ;se è minore non è ne lettera ne numero

up_o:   CMP EBX,57      ;verifico che il carattere sia minore o uguale di 57(nove)
    JBE num     ;e salto a num (il carattere è un numero)
    JMP     ver_c       ;altrimenti verifico se è una lettera

ver_c:  CMP EBX,65      ;verifico se il carattere è maggiore o uguale di 65(A)
    JAE up_A        ;e salto ad up_A (up of 'A')
    JMP     none        ;altrimenti non è nemmeno una lettera e salto

up_A:   CMP EBX,90      ;verifico se il carattere è minore o uguale di 90(Z)
    JBE char        ;e salto a char (il carattere è una lettera)
    JMP min     ;altrimenti potrebbe essere una lettera minuscola

min:    CMP EBX,97      ;verifico se è maggiore ouguale di 97(a)
    JAE up_a        ;e salto ad up_a (up of 'a')

up_a:   CMP EBX,122     ;verifico se è minore o uguale a 122(z)
    JBE char        ;e salto a char (il carattere è una lettera)
    JMP none        ;altrimenti non è un carattere e salto a none

none:   MOV EAX,2       ;il carattere non è ne lettera ne numero
    LEAVE
    RET         ;carico 0 in EAX e termino

char:   MOV EAX,1       ;il carattere è una lettera qundi termino
    LEAVE
    RET

num:    MOV EAX,1       ;il carattere è un numero quindi termino
    LEAVE
    RET

I’ve even tried to use the ASCII’s hex value of the char and the char itself but always the function jump to ‘none’ and returns 0.

What I get wrong?


Source: c#

Leave a Reply