This is my calculator in C++ with in-line assembler:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 |
#include <iostream> #include <stdio.h> #include <string> using namespace std; int main( void ) { int nZahl1 = 0, nZahl2 = 0, nVar3 = 0;string strOp=""; do{ cout << "calculate (+,-,*,/) :" ; cin >> strOp; cout << "number 1: " ; cin >> nZahl1; cout << "number 2: " ; cin >> nZahl2; if("+"==strOp){ asm("ADD %%edx, %%eax \n":"=a"(nZahl1):"d"(nZahl2),"a"(nZahl1)); cout <<" = "<<(nZahl1)<<endl; }else if("-"==strOp){ asm("SUB %%edx, %%eax \n":"=a"(nZahl1):"d"(nZahl2),"a"(nZahl1)); cout <<" = "<<(nZahl1)<<endl; }else if("*"==strOp){ asm("MOV %%edx, %%eax \n":"=a"(nVar3):"d"(nZahl1),"a"(nVar3)); for(int i = 2 ;i<=nZahl2;i++) asm("ADD %%edx, %%eax \n":"=a"(nZahl1):"d"(nVar3),"a"(nZahl1)); cout <<" = "<<(nZahl1)<<endl; }else if("/"==strOp){ asm("MOV %%edx, %%eax \n XOR %%edx,%%edx \n":"=a"(nVar3),"=d"(nZahl1):"d"(nZahl1),"a"(nVar3)); for(int i = nZahl2 ;nVar3>=i;nZahl1++) asm("SUB %%edx, %%eax \n":"=a"(nVar3):"d"(nZahl2),"a"(nVar3)); cout <<" = "<<(nZahl1)<<","; for(int i = 0 ;i<=10;i++){ nVar3*=10;nZahl1=0; for(int i = nZahl2 ;nVar3>=i;nZahl1++) asm("SUB %%edx, %%eax \n":"=a"(nVar3):"d"(nZahl2),"a"(nVar3)); cout <<(nZahl1); } cout << endl; } }while(1); return(0); } |
Compile the code:
1 2 |
g++ -o main test.cpp ./main |
output:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
calculate (+,-,*,/) :+ number 1: 4 number 2: 5 = 9 calculate (+,-,*,/) :- number 1: 9 number 2: 4 = 5 calculate (+,-,*,/) :^C sh-4.3# main calculate (+,-,*,/) :+ number 1: 4 number 2: 5 = 9 calculate (+,-,*,/) :- number 1: 9 number 2: 4 = 5 calculate (+,-,*,/) :* number 1: 4 number 2: 5 = 20 calculate (+,-,*,/) :/ number 1: 20 number 2: 4 = 5,00000000000 |