【发布时间】:2015-05-15 08:21:34
【问题描述】:
我有一个 C 程序,它调用一个用 32 位汇编编写的函数,该函数检查输入是字符还是数字,然后返回 1,否则返回 0。 我做错了什么,因为比较总是返回相同的结果。
这里是 C 代码:
#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 numero\n");
}else{
printf("\n\nIl carattere non e' ne lettera ne numero\n");
}
return 0;
}
这里是汇编函数:
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
我什至尝试使用 char 的 ASCII 十六进制值和 char 本身,但函数总是跳转到 'none' 并返回 0。
我做错了什么?
【问题讨论】: