Erste Schritte bei der Montage

Assembly ist eine einfache Sprache, deren Funktion darin besteht, alle erforderlichen Elemente für die Programmierung der Architektur von Desktop-PCs oder Laptops bereitzustellen. Die Lernkurve ist etwas hoch und es können nur sehr wenige Konzepte auf Hochsprachen wie Python, Ruby oder Java angewendet werden. Es ist jedoch die leistungsstärkste Sprache für die Programmierung von Architekturen auf Basis von x64 .

Obwohl es sich um eine komplexe Sprache handelt, werden in den aktuellsten Versionen keine Hexadezimalzahlen verwendet. Sie werden durch Konventionen mit einfacheren Namen ersetzt, die man sich merken und lesen kann, und es werden höhere Merkmale wie die Verwendung von Makros und die Einbeziehung verwendet der vom Benutzer definierten Datentypen.

Am Ende des Entwicklungsprozesses werden diese Codezeilen vom Assembler-Programm gelesen und dann durch einen Prozess in Maschinencode übersetzt, der der Kompilierung in Hochsprachen ähnelt, hier jedoch als Assemblierung bezeichnet wird .

Für die Zwecke dieses Tutorials werden wir in erster Linie sehen, wie der Codierungsprozess in 32 Bit abläuft , da dies ein grundlegender Schritt ist, um ein besseres Verständnis der Sprache und des Codierungsprozesses in 64-Bit- Anwendungen zu erreichen, indem viele Funktionen gemeinsam genutzt werden die 64-Bit x86- Architektur.

Was müssen wir anfangen?

Es gibt viele Möglichkeiten, mit dem Codieren von Assembly für 32-Bit-Anwendungen zu beginnen, aber eine der einfachsten und praktischsten Möglichkeiten ist die Verwendung von Visual Studio, da es eine sogenannte Assembly-Zeile gibt, in der der Assembly- Code in normales C ++ eingebettet ist wir können es in einer einzelnen Zeile oder in Codeblöcken mit dem reservierten Wort __asm ​​tun .

Wichtig
Das reservierte Wort __asm ​​kann mit einem einzelnen Unterstrich verwendet werden. Dies ist eine alte Richtlinie, die verwendet wird, um die Kompatibilität in weniger modernen Anwendungen sicherzustellen.

Es wurde klargestellt, dass wir zunächst Visual Studio beziehen müssen. Für dieses Lernprogramm wurde die Express- Version verwendet, der Code ist jedoch in beiden IDE- Versionen gültig. Wir laden unter folgendem Link unsere IDE herunter und führen im Installer aus:

assembly-primeros-pasos.jpg

Nachdem der Installationsprozess abgeschlossen ist, können wir mit der Codierung in Assembly beginnen . Dazu werden wir in einem kleinen Beispiel demonstrieren, wie wir den Assemblycode in C ++ mit dem reservierten Wort __asm ​​einbetten können , wobei jedes Codesegment neben diesem Wort behandelt wird als systemeigener Assembly- Code vom C ++ – Compiler.

Online-Montage

Wir haben unser Visual Studio geöffnet und ein neues Projekt vom Typ ” Win32-Konsolenanwendung” erstellt. Klicken Sie auf “OK”. Es wird ein Assistent zur Projekterstellung angezeigt, der Sie fragt, welche Art von Projekt Sie möchten. Wenn Sie ein leeres Projekt wünschen, empfehlen wir, alle Optionen standardmäßig zu belassen und drücken Sie Fertig stellen :

Versammlung-erste-Schritte-2.jpg

Der Assistent erstellt einen Basiscode für unser Projekt, der eine Bibliothek und die Hauptmethode enthält. Dies sollte folgendermaßen aussehen:

 #include "stdafx.h" int _tmain (int argc, _TCHAR * argv []) {return 0;} 

Nachdem wir nun den Basiscode haben, müssen wir unsere Assembly- Line hinzufügen, und wir müssen auch die Bibliothek <iostream> hinzufügen, um über die Konsole und den Namespace drucken zu können, damit alles korrekt funktioniert. Sehen wir uns den endgültigen Code an:

 #include "stdafx.h" #include <iostream> using Namespace std; int _tmain (int argc, _TCHAR * argv []) {int x = 0; _asm mov x, 25 cout << "Der Wert für x ist:" << x << endl; 0 zurückgeben;} 

Wir haben hier eine Variable mit dem Namen x definiert und dann mit dem Code Assembly den Wert 25 zugewiesen, um sie schließlich mit cout auszudrucken, da das Einbetten des Assembler- Codes einfach genug ist. Jetzt müssen wir nur noch unser kleines Programm ausführen. Dafür können wir Strg + F5 drücken, wo es kompiliert und unser Programm ausgeführt wird. Schauen wir uns an, wie diese Operation aussieht:

See also  Zurück zur vorherigen Version Windows 10 installiert, wenn das Update nicht funktioniert

Versammlung-erste-Schritte-3.jpg

Zusätzlich können wir in unseren C ++ – Code mehrere Zeilen Assembly- Code einfügen. Dies erreichen wir, indem wir das reservierte Wort __asm ​​platzieren und einen Codeblock öffnen. Sehen wir uns an, wie wir dies erreichen:

 float Sqrt (float f) {__asm ​​{fld f // Platziere f in die Operationen stackfsqrt // Berechne sqrt}} 
Vorteile der Online-Montage
Die Verwendung der Online-Assembly anstelle einer nativen 32-Bit- Assembly-Anwendung bietet viele Vorteile. Beispielsweise wird das Senden von Parametern an Funktionen vollständig vom C ++ – Compiler übernommen, und es wird die genaue Menge an Maschinencode eingefügt Wir sollten uns also keine Gedanken über einen Speicherüberlauf oder ähnliches machen.

Da wir aber Vorteile haben, finden wir auch Nachteile dieser Art der Codierung. Eine davon ist, dass der Entwickler ein wenig die Kontrolle über die Anwendung verliert, beispielsweise um den Stapel zu manipulieren oder sogar eigene Konventionen zu definieren.

Native Assembly in C ++

Die Online-Assembly bietet viel Flexibilität und ermöglicht uns einen schnellen und einfachen Einstieg in diese Welt. Diese Codierungsmethode verhindert jedoch, dass Entwickler auf einige Assembly-Elemente zugreifen können. Aus diesem Grund ist es üblich, unserem Projekt systemeigenen und separaten Code hinzuzufügen.

Dazu müssen wir unsere Dateien separat erstellen und dann die erforderlichen Methoden einbeziehen. Um unser Ziel zu erreichen, werden wir die folgenden Schritte ausführen:

– Primero creamos un nuevo proyecto, puede ser un proyecto de tipo C++ o de aplicación de Windows , ambos funcionan para añadir los archivos de Assembly . 1 – Zuerst erstellen wir ein neues Projekt. Es kann sich um ein C ++ – Projekt oder eine Windows-Anwendung handeln , die beide arbeiten, um die Assembly- Dateien hinzuzufügen.

– Añadimos un archivo C++ a nuestro proyecto que llamaremos principal.cpp el cuál se encargará de llamar a un procedimiento de nuestro archivo Assembly enviándole un arreglo de valores numéricos y luego imprimiendo lo que retorne este procedimiento, veamos el contenido de nuestro archivo principal.cpp : 2 – Wir fügen unserem Projekt eine C ++ – Datei hinzu, die wir als Prinzipal.cpp bezeichnen. Dadurch wird eine Prozedur unserer Assembly- Datei aufgerufen, die ein Array von numerischen Werten sendet. Anschließend wird gedruckt, was diese Prozedur zurückgibt. Schauen wir uns den Inhalt unserer Hauptdatei an. cpp :

 #include <iostream> mit dem Namespace std; extern "C" int findNumMenor (int * i, int count); int main () {int arr [] = {4, 2, 6, 4, 5, 1, 8, 9 5, -5}; cout << "Die kleinste Zahl ist:" << findNumMenor (arr, 10) << endl; cin.get (); 0 zurückgeben;} 

– Luego hacemos click derecho en nuestro proyecto, el mismo se encuentra en la parte derecha de nuestra interfaz, en la sección de Solution Explorer . 3 – Dann klicken wir mit der rechten Maustaste auf unser Projekt. Es befindet sich auf der rechten Seite unserer Benutzeroberfläche im Bereich “Projektmappen- Explorer “. Wählen Sie die Build-Abhängigkeiten und dann Build-Anpassungen . Wir tun dies, um festzulegen, wie Visual Studio mit Dateien mit der Erweiterung .asm umgehen soll , da wir nicht möchten, dass der C ++ – Compiler diese Dateien kompiliert. Unser Ziel ist es, dass VS diese Dateien MASM zur Verfügung stellt, um sie zusammenzusetzen und dann mit unseren Dateien zu verknüpfen C ++ ist für die Erstellung der endgültigen ausführbaren Datei verantwortlich.

See also  Wichtige Tastenkombinationen für Microsoft Edge

– Para finalizar con las dependencias seleccionamos la opción de masm como podemos ver en la siguiente imagen: 4 – Um mit den Abhängigkeiten fertig zu werden, wählen wir die Option masm aus, wie wir in der folgenden Abbildung sehen können:

Versammlung-erste-Schritte-4.jpg

Es ist wichtig, dass Sie diesen Schritt ausführen, bevor Sie Dateien mit Assemblycode hinzufügen, da Visual Studio festlegt, was eine Datei tun soll, wenn sie erstellt wird, und nicht, wenn sie erstellt wird.

– Luego necesitamos agregar otro archivo C++, pero esta vez con la extensión .asm , para este tutorial lo he llamado ensamblador.asm . 5 – Dann müssen wir eine weitere C ++ – Datei hinzufügen, diesmal jedoch mit der Erweiterung .asm . Für dieses Tutorial habe ich sie assembler.asm genannt . Auf die gleiche Weise können wir ihm einen beliebigen Namen geben, mit Ausnahme von main.asm, da der Compiler möglicherweise Probleme hat, die Position Ihrer Hauptmethode zu ermitteln.

– Nuestro archivo ensamblador.asm se encargará de calcular de una serie de valores numéricos cual es el valor más pequeño entre estos y luego C++ se encargará de recibir el valor para procesarlo mediante cout, veamos el contenido de nuestro archivo: 6 – Unsere Datei assembler.asm berechnet aus einer Reihe von numerischen Werten, die den kleinsten Wert darstellen, und C ++ erhält den Wert, der von cout verarbeitet werden soll. Sehen wir uns den Inhalt unserer Datei an:

 ; 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 Fertig ; MainLoop: cmp dword ptr [edx], eax; cmovl eax, dword ptr [edx]; add edx, 4; dec ecx; jnz MainLoop; Finished: ret; findNumMenor endpend 

Dies ermöglicht es uns, sowohl unsere Dateien als auch unsere Logik zu trennen. Die Realisierung dieser Art von Prozeduren auf 32-Bit-Basis wird nur sehr selten verwendet. Es ist jedoch wichtig, alle Auswirkungen zu kennen. Sehen wir uns nun an, wie wir unseren Code für eine 64-Bit- Anwendung ändern und welche Schritte zur Anpassung unserer Visual Studio- Umgebung erforderlich sind .

See also  Grafische Oberflächen Java ausführlich

Anpassung unserer Anwendung für x64

Visual Studio enthält alle erforderlichen Tools, um die native Assembly in C ++ zu unserem Projekt hinzuzufügen. Um jedoch auf 64-Bit-Basis zu arbeiten, müssen wir einige zusätzliche Konfigurationen für unser Projekt vornehmen.

– Los pasos para realizar este tipo de codificación son similares a nuestro ejemplo anterior, pero para adecuar VS nos dirigimos a la opción Build y seleccionamos Configuration Manager : 1 – Die Schritte zum Ausführen dieses Codierungstyps ähneln unserem vorherigen Beispiel, zum Anpassen von VS haben wir jedoch die Option Erstellen ausgewählt und Configuration Manager ausgewählt:

Versammlung-erste-Schritte-5.jpg

– En la pantalla del gestor de configuración vamos a seleccionar la opción New o nuevo en la columna de plataforma, lo cual nos desplegará una segunda pantalla para seleccionar la plataforma del proyecto, seleccionamos x64 y en la opción Copy Settings From dejamos seleccionado la opción de Win32 . 2 – Auf dem Konfigurationsmanager-Bildschirm wählen Sie die Option Neu oder Neu in der Plattformspalte aus. Daraufhin wird ein zweiter Bildschirm angezeigt, auf dem Sie die Projektplattform auswählen, x64 auswählen und in der Option Einstellungen kopieren von lassen Sie die Option ausgewählt von Win32 . Dadurch ändert VS die Routen von der 32-Bit- Version von MASM auf die 64- Bit- Version , sodass die gesamte Arbeit von der IDE erledigt wird.

Versammlung-erste-Schritte-6.jpg

– Hecho esto ya podemos compilar nuestro código y ejecutarlo, sin embargo debemos modificar nuestro archivo Assembly ya que estamos trabajando sobre arquitecturas distintas, veamos el nuevo código para nuestro archivo: 3 – Sobald dies erledigt ist, können wir unseren Code kompilieren und ausführen. Da wir jedoch an verschiedenen Architekturen arbeiten, müssen wir unsere Assembly- Datei ändern. Sehen wir uns den neuen Code für unsere Datei an:

 ; Listing: assembler.asm .code; int findNumMenor (int * arr, int count) FindSmallest proc; mov eax, 7fffffffh; cmp edx, 0; jle Fertig; MainLoop: cmp dword ptr [rcx], eax; cmovl eax, dword ptr [rcx]; füge rcx hinzu, 4; dec edx; jnz MainLoop; Fertig: ret; FindSmallest endp; Ende; 

Damit beenden wir dieses Tutorial, wir haben bereits einen ersten Blick auf die Programmierung mit Assembly geworfen , sie mag am Anfang etwas komplex erscheinen, aber mit einer angemessenen C ++ – Domäne und grundlegenden Vorstellungen der Maschinensprache können wir interessante und nützliche Dinge in unseren Entwicklungen erreichen.

administrator

Leave a Reply

Your email address will not be published. Required fields are marked *