Calculadora em C com Assembly (multiplataforma)
Publicado por André (última atualização em 15/09/2010)
[ Hits: 8.071 ]
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 número em binário em Assembly Puro para Linux 64 bits (Nasm - Netwide Assembler)
Retorna a diferença entre dois vetores em Assemly
Escrita de um número em binário na tela em Assembly Puro para Linux 64 bits (GNU Assem
Escrita de número em hexadecimal em Assembly Puro para Linux 64bits (Nasm - Netwide Assemble)
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
SysAdmin ou DevOps: Qual curso inicial pra essa área? (0)
Melhores Práticas de Nomenclatura: Pastas, Arquivos e Código (3)
[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