Calculadora em C com Assembly (multiplataforma)
Publicado por André (última atualização em 15/09/2010)
[ Hits: 8.173 ]
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); }
Soma dois números lidos da memória
Assembler 8086 - Recebe um caractere do usuário e imprime o código ASCII em pontos
Criar entrada (menuentry) ISO no Grub
Como gerar qualquer emoji ou símbolo unicode a partir do seu teclado
Instalar o VIM 9.1 no Debian 12
Como saber o range de um IP público?
Muitas dificuldades ao instalar distro Linux em Notebook Sony Vaio PCG-6131L (VPCEA24FM)
Slackpkg+ (Slackpkg Plus) está de volta!
Como dividir duas janelas igualmente e lado-a-lado na sua tela
Ocomon 6.0.1 - Problemas ao editar configurações estendidas (7)
instalar o Linux em computadores Acer novos (7)
Será possível instalar Linux Mint LMDE em Sony Vaio? (19)
O livro "Linux - Guia do Administrador do Sistema (Rubem E. Ferre... (1)