Calculadora em C com Assembly (multiplataforma)
Publicado por André (última atualização em 15/09/2010)
[ Hits: 8.428 ]
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);
}
GAS "Hello World" o número de vezes definido pelo usuário
Escrita de um número em hexadecimal na tela em Assembly Puro para Linux 64 bits (GNU Assembly
Intercessão entre dois vetores em Assembly
GAS Inteiro para String (formato binário)
Gentoo binário em 2026: UEFI, LUKS, Btrfs e Systemd
Trabalhando Nativamente com Logs no Linux
Jogando Daikatana (Steam) com Patch 1.3 via Luxtorpeda no Linux
LazyDocker – Interface de Usuário em Tempo Real para o Docker
Por que sua empresa precisa de uma PKI (e como automatizar EMISSÕES de certificados via Web API)
Instalando NoMachine no Gentoo com Systemd (acesso Remoto em LAN)
Gentoo: Trocando wpa_supplicant pelo iwd no NetworkManager (Systemd)
OCS Inventory NG: Instalação de Agentes Linux e Windows + Autenticação HTTP
O Free Download Manager não abre no Fedora 43 KDE Plasma (2)
O que houve com slackware ??? (9)
Permissão acesso as pastas servidor Ubuntu Server 24.04 (5)









