【问题标题】:Assembly 32bit - compare char汇编 32 位 - 比较字符
【发布时间】: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。

我做错了什么?

【问题讨论】:

    标签: c assembly


    【解决方案1】:

    您正在以a地址 作为参数调用您的函数。因此,当您执行 MOV EBX,[EBP+8] 时,您得到的是该地址,而不是存储在该地址的值。

    在第一个CMP 之前,您应该添加一个MOV EBX, [EBX] 以获得a 的值(只是不要在调用printf 之前添加它,因为这会导致printf 失败) .

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 2014-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-09
      相关资源
      最近更新 更多