c - Assembly 32bit - compare char -
i have c program calls function written in 32bit assembly check if input character or number, return 1 else return 0. i've done wrong because comparison return me same result.
here 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); = (int)(input); int result = aisalnum(&a); // printf("\nassembly ritorna: %d",result); if(result == 1) { printf("\nil carattere e' una lettera o un numero\n"); }else{ printf("\n\nil carattere non e' ne lettera ne numero\n"); } return 0; }
and here 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 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 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 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 122(z) jbe char ;e salto char (il carattere è una lettera) jmp none ;altrimenti non è un carattere e salto 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 tried use ascii's hex value of char , char function jump 'none' , returns 0.
what wrong?
you're calling function address of a
argument. when mov ebx,[ebp+8]
you're getting address, not value stored @ address.
before first cmp
should add mov ebx, [ebx]
value of a
(just don't add before call printf
, because cause printf
fail).
Comments
Post a Comment