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: ");

  a = (int)(input);

  int result = aisalnum(&a);
//  printf("nAssembly ritorna: %d",result);
  if(result == 1)
      printf("nIl carattere e' una lettera o un numeron");
      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;

    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

    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
    RET         ;carico 0 in EAX e termino

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

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

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

This site uses Akismet to reduce spam. Learn how your comment data is processed.