Calculadora em C com Assembly (multiplataforma)

Publicado por André (última atualização em 15/09/2010)

[ Hits: 7.947 ]

Homepage: http://127.0.0.1

Download Calc.c




Calculadora avançada escrita em duas linguagens.  C (médio nível) e Assembly (baixo nível).  O autor do código sou eu, e para um melhor entendimento, comentei as linhas do código. Sinta-se a vontade para comentar.

E outra, o código é multiplataforma.

Obs.: FAVOR, MANTER OS CRÉDITOS!

  



Esconder código-fonte

/*-----------------------------------------
* Calculadora escrita em C + Assembly     *
* Código multiplataforma                  *
* Open Source                             *
* Comentei o código para um melhor        *
* entendimento.                           *
* Autor:  André S. Rosa Junior            *
* Contato: andre.rosa36@gmail.com         *
\\----------------------------------------*/

/* Declaração de bibliotecas */
#include <stdio.h>
#include <conio.h>
/* Verifica se está no Windows */
#ifdef WIN32
/* Declara a biblioteca do Windows */
#include <windows.h>
/* Termina a verificação */
#endif

 /* Declaração de variáveis */

    int opc, vNum1, vNum2;

    /* Por segurança, inicializarei todas as variáveis com 0 */
    opc = 0;
    vNum1 = 0;
    vNum2 = 0;

/* Funcao principal */
int main(void){



    /* Enunciado */
    printf("\t\t---------------------------------------\n");
    printf("\t\t| CALCULADORA ESCRITA EM C & ASSEMBLY |\n");
    printf("\t\t---------------------------------------\n");

    printf("\n\n");
    /* Verifica se está no Windows */
    #ifdef WIN32
     /* Chama conteúdo de um bloco de código */
     exibeCredito();
     /* Termina a verificação */
    #endif

    /* bloco de código para solicitação de valores */
    solicitaValores();


    /* Verifica a plataforma */
    #ifdef WIN32

    /* limpa tela (Windows) */
    system("cls");
    #else
    /* limpa tela (Unix, Unix-like, Linux) */
    system("clear");
    #endif

    exibeMenu();



}

 void exibeCredito(){

     /*------------------------- \\
     |OBS: Sleep() necessita da   |
     | windows.h                  |
     \\-------------------------*/
           #ifdef WIN32
    printf("P");

    /* pause de 100 milesegundos */
    Sleep(100);
    printf("r");
    Sleep(100);
    printf("o");
    Sleep(100);
    printf("g");
    Sleep(100);
    printf("r");
    Sleep(100);
    printf("a");
    printf("m");
    Sleep(100);
    printf("a");
    Sleep(100);
    printf("d");
    Sleep(100);
    printf("o  ");
    Sleep(100);
    printf("p");
    Sleep(100);
    printf("o");
    Sleep(100);
    printf("r");
    Sleep(100);
    printf("  A");
    Sleep(100);
    printf("n");
    Sleep(100);
    printf("d");
    Sleep(100);
    printf("r");
    Sleep(100);
    printf("e");
    printf("\n\n");
    Sleep(200);

    #endif

    }

    void menuSoma(){

    int resultSoma(){

  __asm__("mov %%ecx, %%eax": : "c"(vNum1 + vNum2));
    }

    printf(" \n\n\tA soma de %d com %d e: %d\n\n",vNum1, vNum2, resultSoma(0));

    }

 void menuSubtrai(){

    int resultSub(){

  __asm__("mov %%ecx, %%eax": : "c"(vNum1 - vNum2));
    }

    printf(" \n\n\tA subtracao de %d por %d e: %d\n\n",vNum1, vNum2, resultSub(0));

    }

     void menuMultiplica(){

    int resultMul(){

  __asm__("mov %%ecx, %%eax": : "c"(vNum1 * vNum2));
    }

    printf(" \n\n\tA multiplicacao de %d por %d e: %d\n\n",vNum1, vNum2, resultMul(0));


    }

     void menuDivide(){

         if(vNum1 < vNum2){

            printf("\n\n\t\tEntre com um dividendo maior! \n\n");
            getchar();
            getchar();

            #ifdef WIN32
            system("cls");
            #else
            system("clear");
            #endif

            return solicitaValores();
         }
         else{



         }

    int resultDiv(){
 /*codigo assembly  */
  __asm__("mov %%ecx, %%eax": : "c"(vNum1 / vNum2));
    }

    printf(" \n\n\tA divisao de %d por %d e: %d\n\n",vNum1, vNum2, resultDiv(0));
     }



     void menuCreditos(){

            #ifdef WIN32
            system("cls");
            #else
            system("clear");
            #endif

     /* chama bloco exibeCredito() */
     exibeCredito();
    printf("\n\t\tE-mail: andre.rosa36@gmail.com");
    printf("\n\t\tViva o Linux: \nhttp://vivaolinux.com.br/perfil/verPerfil.php?login=fairplay");
    printf("\n\n\t\tOBRIGADO POR USAR MEU PROGRAMA! \n\n\n\n");

    getchar();

    }

    void menuSair(){

    /* pause execução */
    getchar();
    }

    void exibeMenu(){

    /* Menu para escolha de operação */
    printf("\t SELECIONE UMA OPCAO: ");
    printf("\n\n");
    printf("\t[1] Adicao");
    printf("\n\t[2] Subtracao");
    printf("\n\t[3] Multiplicacao");
    printf("\n\t[4] Divisao");
    printf("\n\t[5] Creditos");
    printf("\n\t[0] Sair");
    printf("\n\n\t\t>> ");

    /* lê a opção do usuário */
    scanf("%d",&opc);


    /* Indica que a variável "opc" será responsável
    pela escolha da operação */
    switch(opc){

        /* Opção 1,2,3,4... */
        case 1:

        menuSoma();

        break;

        case 2:

        menuSubtrai();

        break;

        case 3:

        menuMultiplica();

        break;

        case 4:

        menuDivide();

        break;

        case 5:

        menuCreditos();

        break;

        case 0:

        menuSair();

        break;

        /* se não for nenhuma das opçoes...  */
        default:

        printf("\n\t\tEntre com uma opcao valida! \n");
        #ifdef WIN32

        Sleep(900);
        system("cls");

        #else

        system("clear");

        #endif

        /* retorna ao bloco de exibição do menu */
        return exibeMenu();



    }


    }

    void solicitaValores(){

    /* Solicita o primeiro valor */
    printf("Entre com o primeiro valor: ");
    /* lê o valor */
    scanf("%d",&vNum1);
    /* "idem" acima */
    printf("Entre com o segundo valor: ");
    scanf("%d",&vNum2);
    }


Scripts recomendados

Árvore binária de busca em Assembler 8086

Escrita de número em octal em Assembly puro para Linux 64 bits (NASM - Netwide Assembler)

Hora do sistema

Escrita de um número em decimal na tela em Assembly Puro para Linux 64 bits (GNU Assembly)

FreeBSD Write


  

Comentários
[1] Comentário enviado por danilo m galhard em 16/09/2011 - 07:16h

Cara como vc compila duas linguagens d programacao Juntas?

[2] Comentário enviado por victocha em 03/04/2012 - 20:28h

Muito interessante... mas ficaria ainda mais se você comentasse os trechos em asm =D

Se der eu agradeço, vlws e parabéns.

[3] Comentário enviado por inacioalves em 13/04/2013 - 19:49h

Não deve nem compilar no linux devido a biblioteca conio.h.

$ gcc -o Calc Calc.c
Calc.c:13:19: erro fatal: conio.h: Arquivo ou diretório não encontrado
compilação terminada.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts