Здесь рассматривается пример простейшего калькулятора
IV
Здесь рассматривается пример простейшего калькулятора. Для ассемблера часто сложно найти библиотеки с определенными процедурами, писать же все самому - не хватит времени. Предлагаемая схема очень проста. По сути, программа на языке Си (или другом языке высокого уровня) является неким каркасом. Она вызывает процедуру на языке ассемблера, которая и выполняет основные действия. Кроме того, в Си-модуле можно поместить и другие процедуры, которые легче написать на Си и которые будут вызываться из ассемблера. Здесь как раз и приводится такой пример. В Си-модуле я поместил процедуры, преобразующие строки в вещественные числа, выполняющие над ними действия и затем преобразующие результат опять в строку.
// calcc.срр #include <windows.h> #include <stdio.h>
// вызов главной ассемолернои процедуры extern "С" _stdcall MAIN1(); // сложить extern "С" _stdcall void sum(char *, char *, char *); // вычесть extern "C" _stdcall void su(char *, char *, char *); // умножить extern "C" _stdcall void mu(char *, char *, char *); // разделить extern "C" _stdcall void dii(char *, char *, char *);
int WINAPI WinMain (HINSTANCE hThisInst, HINSTANCE hPrevInst, LPSTR lpszArgs, int nWinMode) { MAIN1(); return 0; }
extern "C" _stdcall void sum(char * s1, char * s2, char * s) { float f1,f2,f; f1=atof(s1); f2=atof(s2); f=f1+f2; sprintf(s,"%f",f); strcat(s," +"); return; }
extern "C" _stdcall void su(char * s1, char * s2, char * s) { float f1,f2,f; f1=atof(s1); f2=atof(s2); f=f1-f2; sprintf(s,"%f",f); strcat(s," -"); return; }
extern "C" _stdcall void mu(char * s1, char * s2, char * s) { float f1,f2,f; f1=atof(s1); f2=atof(s2); f=f1*f2; sprintf(s,"%f",f); strcat(s," *"); return; }
extern "C" __stdcall void dii(char * s1, char * s2, char * s) { float f1,f2,f; f1=atof(s1); f2=atof(s2); if(f2!=0) { f=f1/f2; sprintf(s,"%f",f); strcat(s," /"); } else strcpy(s,"Ошибка деления"); return; }