Primii pași cu Asamblarea

Cuprins
Asamblare este un limbaj de nivel scăzut a cărui funcție este de a furniza toate elementele necesare pentru programarea arhitecturii computerelor desktop sau laptopurilor. Curba de învățare este puțin abruptă și foarte puține concepte pot fi aplicate din limbaje de nivel înalt, cum ar fi Python, Ruby sau JavaCu toate acestea, este cel mai puternic limbaj pentru arhitecturi de programare bazate pe x64.
În ciuda faptului că este un limbaj complex, în cele mai actuale versiuni, acesta lasă deoparte utilizarea hexadecimalelor și le înlocuiește cu convenții de denumire care sunt mai ușor de reținut și de citit, pe lângă faptul că au caracteristici mai ridicate, cum ar fi permiterea utilizării macro-urilor și includerea definită de utilizator tipuri de date.
Când procesul de dezvoltare se termină, aceste linii de cod sunt citite de programul de asamblare și apoi traduse în codul mașinii printr-un proces similar cu cel al compilare în limbi de nivel înalt, dar aici se numește a te alatura.
În scopul acestui tutorial, vom vedea în primă instanță cum este procesul de codare 32 de biți, deoarece este un pas fundamental pentru a obține o mai bună înțelegere a limbajului și a procesului de codificare în aplicațiile de 64 de biți, acest lucru împărtășind multe caracteristici cu arhitectura x86 Pe 64 de biți.
Există multe modalități de a începe codarea Asamblare pentru aplicații pe 32 de biți, dar una dintre cele mai ușoare și mai practice modalități de a face acest lucru este prin Studio vizual întrucât are ceva numit asamblate online unde codul de Asamblare este încorporat în C ++ normal și curent, acest lucru se poate face într-o singură linie sau în blocuri de cod cu cuvântul rezervat __asm.
ImportantCuvântul cheie __asm ​​poate fi utilizat cu o singură subliniere. Aceasta este o directivă veche utilizată pentru a asigura compatibilitatea în aplicații mai puțin moderne.
După ce am clarificat acest lucru, primul lucru pe care trebuie să-l facem este să obținem Studio vizual, pentru acest tutorial am folosit versiunea Expres cu toate acestea, codul este valabil în ambele versiuni ale SDI. Descărcăm în următorul link SDI și rulăm în programul de instalare:

După terminarea procesului de instalare, putem începe codarea Asamblare, pentru aceasta vom face un mic exemplu în care vom demonstra cum putem încorpora codul Asamblare în C ++ cu cuvântul rezervat __asm, de unde orice segment de cod de lângă acest cuvânt va fi tratat ca un cod nativ de la Asamblare de către compilator C ++.
Ne deschidem Visual Studio și creăm un nou proiect de tip Aplicația pentru consola Win32, împingem Bine și va fi afișat expertul de creare a proiectului, care ne va întreba ce tip de proiect dorim și dacă dorim unul gol, vă recomandăm să lăsați toate opțiunile implicite și să apăsați Finalizează:

MARI

Expertul va crea un cod de bază pentru proiectul nostru, care va conține o bibliotecă și metoda principală, ar trebui să arate astfel:
 #include "stdafx.h" int _tmain (int argc, _TCHAR * argv []) {return 0;}
Având codul de bază acum, trebuie să adăugăm linia noastră de Asamblare, în plus, trebuie să adăugăm biblioteca pentru a putea imprima prin consolă și spațiu de nume pentru ca totul să funcționeze corect, să vedem codul final:
 #include "stdafx.h" #include folosind namespace std; int _tmain (int argc, _TCHAR * argv []) {int x = 0; _asm mov x, 25 cout << "Valoarea pentru x este:" <<>
Ceea ce am făcut aici este să definim o variabilă numită x și apoi prin cod Asamblare îi atribuim valoarea 25, pentru a o imprima în cele din urmă cu cout, după cum putem vedea, este un proces destul de simplu pentru a încorpora Cod asamblare, acum trebuie doar să rulăm micul nostru program, pentru aceasta putem apăsa Ctrl + F5 unde programul nostru va fi compilat și executat, să vedem cum arată această operație:

MARI

În plus, putem include mai multe linii de cod de la Asamblare în codul nostru C ++, pe care îl putem realiza plasând cuvântul rezervat __asm și deschiderea unui bloc de cod, să vedem cum realizăm acest lucru:
 float Sqrt (float f) {__asm ​​{fld f // Puneți f pe stiva de operații fsqrt // Calculați sqrt}}
Avantajele asamblării în linieExistă multe avantaje ale utilizării ansamblului inline în locul unei aplicații native de 32 de biți de Asamblare, de exemplu, trimiterea parametrilor către funcții este complet gestionată de compilatorul de C ++ și va injecta cantitatea exactă de cod al mașinii, astfel încât să nu ne facem griji cu privire la o revărsare a memoriei sau ceva de genul acesta.
Dar la fel cum avem avantaje, găsim și dezavantaje în acest mod de codare, unul dintre ele este că dezvoltatorul își pierde puțin control asupra aplicației, cum ar fi manipularea stivei sau chiar definirea propriilor convenții.
Asamblarea online oferă multă flexibilitate și ne permite să intrăm în această lume rapid și ușor, dar această metodă de codare împiedică dezvoltatorii să acceseze unele elemente de asamblare, din acest motiv este obișnuit să adăugăm cod nativ și separat la proiectul nostru.
Pentru aceasta, trebuie să ne creăm fișierele separat și apoi să includem metodele de care avem nevoie, pentru a ne atinge obiectivul, vom urma următorii pași:
1- Mai întâi creăm un proiect nou, poate fi un proiect de tip C ++ sau din aplicația Windows, ambele funcționează pentru a adăuga fișierele din Asamblare.
2- Adăugăm un fișier C ++ la proiectul nostru pe care îl vom numi principal.cpp care va fi însărcinat cu apelarea unei proceduri din dosarul nostru Asamblare trimitându-i o serie de valori numerice și apoi imprimând ceea ce returnează această procedură, să vedem conținutul fișierului nostru principal.cpp:
 #includeți utilizarea spațiului de nume std; extern "C" int findMinorNum (int * i, int count); int main () {int arr [] = {4, 2, 6, 4, 5, 1, 8, 9, 5, -5}; cout << "Cel mai mic număr este:" << findMinorNum (arr, 10) << endl; cin.get (); returnează 0;}
3- Apoi facem clic dreapta pe proiectul nostru, acesta se găsește în partea dreaptă a interfeței noastre, în secțiunea Solution Explorer. Selectăm Construiți dependențe Și mai târziu Creați personalizări. Facem acest lucru pentru a stabili modul în care Visual Studio va gestiona fișierele cu extensia .asmDeoarece nu dorim ca compilatorul C ++ să compileze aceste fișiere, obiectivul nostru este ca VS să furnizeze aceste fișiere MAI M astfel încât să le asamblu și apoi aceste fișiere legate de C ++ vor fi responsabile pentru formarea executabilului final.
4- Pentru a termina cu dependențele selectăm opțiunea de mai mult M așa cum putem vedea în următoarea imagine:

MARI

Este important să efectuați acest pas înainte de a adăuga fișiere cu codul de asamblare ca Studio vizual atribuie ce trebuie să facă un fișier atunci când este creat și nu când este construit.
5- Apoi, trebuie să adăugăm un alt fișier C ++, dar de data aceasta cu extensia .asm, pentru acest tutorial l-am numit asamblator.asm. În același mod îi putem pune orice nume, cu excepția main.asm, deoarece compilatorul poate avea probleme la localizarea unde este metoda dvs. principală.
6- Arhiva noastră asamblator.asm Acesta se va ocupa de calcularea dintr-o serie de valori numerice care este cea mai mică valoare dintre acestea și apoi C ++ Se va ocupa să primească valoarea pentru a o procesa prin cout, să vedem conținutul fișierului nostru:
; assembler.asm.xmm.model flat, c.data.code findNumMenor proc exportmov edx, dword ptr [esp + 4]; mov ecx, dword ptr [esp + 8]; mov eax, 7fffffffh; cmp ecx, 0; jle Finished ; MainLoop: cmp dword ptr [edx], eax; cmovl eax, dword ptr [edx]; add edx, 4; dec ecx; jnz MainLoop; Finalizat: ret; findNumMinor endpend
Acest lucru ne permite să separăm fișierele noastre, precum și logica noastră. Realizarea acestui tip de proceduri bazate pe 32 de biți este foarte puțin utilizată, dar este important să îi cunoaștem toate implicațiile, să vedem acum cum ne schimbăm codul pentru o aplicație de 64 de biți precum și pașii pe care trebuie să-i facem pentru a ne adapta mediul Studio vizual.
Visual Studio include toate instrumentele necesare pentru a adăuga ansamblul nativ la proiectul nostru C ++, dar să lucreze pe baza 64 de biți trebuie să facem câteva configurații suplimentare proiectului nostru, să vedem:
1- Pașii pentru realizarea acestui tip de codare sunt similari cu exemplul nostru anterior, dar pentru a se adapta VS mergem la opțiune Construi și selectăm Manager de configurare:

2- În ecranul managerului de configurare vom selecta opțiunea Nou sau nou în coloana platformă, care va afișa un al doilea ecran pentru a selecta platforma proiectului, o selectăm x64 și în opțiune Copiați setările din am lăsat selectată opțiunea de Win32. Acest lucru va face VS modificați versiunile versiunii din 32 de biți de MAI M la cea a 64, deci toată munca va fi realizată de IDE.

MARI

3- Odată ce acest lucru este făcut, putem compila codul nostru și îl putem executa, totuși trebuie să ne modificăm fișierul Asamblare deoarece lucrăm la diferite arhitecturi, să vedem noul cod pentru fișierul nostru:
; Listare: assembler.asm .code; int findMinorNum (int * arr, int count) FindSmallest proc; mov eax, 7fffffffh; cmp edx, 0; jle Finalizat; MainLoop: cmp dword ptr [rcx], eax; cmovl eax, dword ptr [rcx]; se adaugă rcx, 4; dec edx; jnz MainLoop; Finalizat: ret; FindSmallest endp; Sfârșit;
Cu aceasta terminăm acest tutorial, am aruncat deja o primă privire asupra programării cu Asamblare, poate părea oarecum complex la început, dar cu o stăpânire adecvată a C ++ și noțiunile de bază ale limbajului mașinii putem realiza lucruri interesante și utile în dezvoltarea noastră.V-a plăcut și ați ajutat acest tutorial?Puteți recompensa autorul apăsând acest buton pentru a-i oferi un punct pozitiv

Vei ajuta la dezvoltarea site-ului, partajarea pagina cu prietenii

wave wave wave wave wave