In questo video mostro i comandi per compilare sorgenti C, con gcc e sorgenti asm (assembly) con nasm e ld. I programmi, di cui pubblico i sorgenti, catturano eventi di Windows, come il movimento del mouse, la pressione e il rilascio di un tasto. Infine compilo il file nasm "messagebox.asm". Mostro come, coinvolgendo la dll "user32.dll" e il comando ld, si possa ottenere un eseguibile più leggero di quello che si può generare con nasm e gcc.
Ecco i sorgenti:
file "eventi-windows.c"
#include windows.h
#include stdio.h
char nomeclasse[ ] = "WindowsApp";
char captionfinestra[ ] = "La mia finestra\0";
int larghezza = 600;
int altezza = 200;
int x;
int y;
HWND finestra; /* This is the handle for our window */
MSG messaggi;
WNDCLASSEX strutturafinestra; /* Data structure for the windowclass */
/* Declare Windows procedure */
/* This function is called by the Windows function DispatchMessage() */
LRESULT CALLBACK ProceduraWindows(HWND oggettofinestra, UINT messaggiowindows, WPARAM wParam, LPARAM lParam)
{
switch (messaggiowindows) /* handle the messaggi */
{
case WM_DESTROY:
PostQuitMessage (0);
break;
case WM_KEYUP:
printf("Tasto rilasciato... %c
",wParam);
break;
case WM_KEYDOWN:
printf("Tasto premuto... %c
",wParam);
break;
case WM_MOUSEMOVE:
puts("IL mouse si muove...
");
break;
default: /* for messaggi that we don't deal with */
return DefWindowProc (oggettofinestra, messaggiowindows, wParam, lParam);
}
return 0;
}
int WINAPI
WinMain (HINSTANCE istanzaquestoprogramma,
HINSTANCE hPrevInstance,
LPSTR lpszArgument,
int nFunsterStil)
{
/* The Window structure */
strutturafinestra.hInstance = istanzaquestoprogramma;
strutturafinestra.lpszClassName = nomeclasse;
strutturafinestra.lpfnWndProc = ProceduraWindows; /* This function is called by windows */
strutturafinestra.style = CS_DBLCLKS; /* Catch double-clicks */
strutturafinestra.cbSize = sizeof (WNDCLASSEX);
/* Use default icon and mouse-pointer */
strutturafinestra.hIcon = LoadIcon (NULL, IDI_APPLICATION);
strutturafinestra.hIconSm = LoadIcon (NULL, IDI_APPLICATION);
strutturafinestra.hCursor = LoadCursor (NULL, IDC_ARROW);
strutturafinestra.lpszMenuName = NULL; /* No menu */
strutturafinestra.cbClsExtra = 0; /* No extra bytes after the window class */
strutturafinestra.cbWndExtra = 0; /* structure or the window instance */
/* Use Windows's default color as the background of the window */
strutturafinestra.hbrBackground = (HBRUSH) COLOR_BACKGROUND;
/* Register the window class, and if it fails quit the program */
if (!RegisterClassEx (&strutturafinestra))
return 0;
/* The class is registered, let's create the program*/
finestra = CreateWindowEx (
0, /* Extended possibilites for variation */
nomeclasse, /* Classname */
captionfinestra, /* Title Text */
WS_OVERLAPPEDWINDOW, /* default window */
x, /* Windows decides the position */
y, /* where the window ends up on the screen */
larghezza, /* The programs width */
altezza, /* and height in pixels */
HWND_DESKTOP, /* The window is a child-window to desktop */
NULL, /* No menu */
istanzaquestoprogramma, /* Program Instance handler */
NULL /* No Window Creation data */
);
/* Make the window visible on the screen */
ShowWindow (finestra, nFunsterStil);
/* Run the messaggio loop. It will run until GetMessage() returns 0 */
while (GetMessage (&messaggi, NULL, 0, 0))
{
/* Translate virtual-key messaggi into character messaggi */
TranslateMessage(&messaggi);
/* Send messaggio to ProceduraWindows */
DispatchMessage(&messaggi);
}
/* The program return-value is 0 - The value that PostQuitMessage() gave */
return messaggi.wParam;
}
/************************************
file "messagebox.asm"
bits 64
MB_OK equ 0
NULL equ 0
extern MessageBoxA
global WinMain
section .text
WinMain:
push rbp
mov rbp,rsp
mov rcx, NULL
lea rdx, messaggio1
lea r8, messaggio2
mov r9, MB_OK
call MessageBoxA
mov rax,0
mov rsp,rbp
pop rbp
ret
section .data
messaggio1: db "This is the message.", 0
messaggio2: db "This is the title.", 0
"eventi-windows.asm" eccede i limiti.
Негізгі бет Compilazione-con-nasm-gcc-ld
No video
Пікірлер: 1