Calculadora em C com Assembly (multiplataforma)
Publicado por André (última atualização em 15/09/2010)
[ Hits: 8.334 ]
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);
}
codigo em assembley que soma dois numeros
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
Como instalar o repositório do DBeaver no Ubuntu
Como instalar o Plex Media Server no Ubuntu
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
Assinador JNLP do Site Portal da Nota Fiscal Eletrônica (2)
O programa assinador digital (3)
Warcraft II Remastered no Linux? (2)









