Calculadora em C com Assembly (multiplataforma)
Publicado por André (última atualização em 15/09/2010)
[ Hits: 8.338 ]
Homepage: http://127.0.0.1
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!
/*-----------------------------------------
* 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);
    }
"Clear Screen" para Linux x86 com Inline Assembly (embutido no código) em C
"Clear Screen" para Linux x86 em Assembly Puro (Nasm - Netwide Assembler)
Retorna a diferença entre dois vetores em Assemly
Retorna o maior e menor elemento de um vetor em Assembly
Escrita de um número em hexadecimal na tela em Assembly Puro para Linux x86 (GNU Assembly)
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Problemas com Driver NVIDIA (5)
Warcraft II Remastered no Linux? (8)
Instalação dualboot Windows 11 e Debian 13 (7)









