Calculadora em C com Assembly (multiplataforma)
Publicado por André (última atualização em 15/09/2010)
[ Hits: 8.070 ]
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); }
Escrita de um número em hexadecimal na tela em Assembly Puro para Linux 64 bits (GNU Assembly
Assembler 8086 - Simples código que mostra horas e minutos em pontos
Escrita de número em binário em Assembly Puro para Linux 64 bits (Nasm - Netwide Assembler)
Escrita de número em octal em Assembly puro para Linux 64 bits (NASM - Netwide Assembler)
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Não to conseguindo resolver este problemas ao instalar o playonelinux (1)
Excluir banco de dados no xampp (1)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta