Unterprogramme in Assembler

Diskutiere Unterprogramme in Assembler im Hausaufgaben Bereich.
Kirby_Sike

Kirby_Sike

@mihe7 Es ist wieder so weit....It`s Assembler time xD Könnte mir jemand erläutern wie Unterprogramme in Assembler funktionieren ?

In Java sind Unterprogramme z.B. Methoden:

Java:
public int getAnzahlCookies(int newCookie){
    return this.cookie + newCookie;
}
- Meine Fragen wäre z.B. wie übergebe ich Werte an das Unterprogramm?
- Ich weiß noch dass man irgendwie eine Rücksprung Adresse retten muss, jedoch wie und was genau?

Der Befehlsatz ist im Anhang :)
 

Anhänge

Zuletzt bearbeitet:
mihe7

mihe7

Meine Fragen wäre z.B. wie übergebe ich Werte an das Unterprogramm?
Allgemein kann man das nicht sagen, da Du in Assembler alle Freiheiten hast. Du könntest z. B. Register, einen Stack oder einen fixen Speicherbereich verwenden. Das gilt natürlich auch für Rückgabewerte.

Ich weiß noch dass man irgendwie eine Rücksprung Adresse retten muss, jedoch wie und was genau?
Manual, ab Seite 8.
 
mihe7

mihe7

Noch ein Beispiel: unter DOS gibt's den berühmten Interrupt 21h für bestimmte Systemaufrufe. Ein Interrupt funktioniert zwar ein wenig anders aber das ändert am Prinzip der Parameter ja nichts. Das AH-Register wird mit der auszuführenden Funktion belegt (1. Parameter). Je nach Funktion können dann Parameter mit anderen Registern übergeben werden.

Code:
MOV dl, 65
MOV ah, 2 ; Ausgabe des in dl übergebenen Zeichens auf dem Bildschirm, also ein A
INT 21h
MOV ah, 0 ; Ende
INT 21h
Wenn Du die Übersetzung als .com-Datei speicherst und die unter DOS ausführst, erhältst Du ein A am Bildschirm ausgegeben. Für komplexere Dinge werden Speicheradressen in Registern übergeben. Der eigentliche Parameter befindet sich dann im Hauptspeicher. So gibt es die Funktion 9 (AH=9), bei der die Adresse eines Strings (also ein Zeiger auf den Beginn des Strings) in den Registern DS:DX erwartet wird.

Das gleiche Prinzip kannst Du natürlich für Unterprogramme verwenden. Bei mehreren Parametern bietet sich aber der Stack an, der ja auch nichts anderes ist als ein Bereich im Speicher.
 
Kirby_Sike

Kirby_Sike

Noch ein Beispiel: unter DOS gibt's den berühmten Interrupt 21h für bestimmte Systemaufrufe. Ein Interrupt funktioniert zwar ein wenig anders aber das ändert am Prinzip der Parameter ja nichts. Das AH-Register wird mit der auszuführenden Funktion belegt (1. Parameter). Je nach Funktion können dann Parameter mit anderen Registern übergeben werden.

Code:
MOV dl, 65
MOV ah, 2 ; Ausgabe des in dl übergebenen Zeichens auf dem Bildschirm, also ein A
INT 21h
MOV ah, 0 ; Ende
INT 21h
Wenn Du die Übersetzung als .com-Datei speicherst und die unter DOS ausführst, erhältst Du ein A am Bildschirm ausgegeben. Für komplexere Dinge werden Speicheradressen in Registern übergeben. Der eigentliche Parameter befindet sich dann im Hauptspeicher. So gibt es die Funktion 9 (AH=9), bei der die Adresse eines Strings (also ein Zeiger auf den Beginn des Strings) in den Registern DS:DX erwartet wird.

Das gleiche Prinzip kannst Du natürlich für Unterprogramme verwenden. Bei mehreren Parametern bietet sich aber der Stack an, der ja auch nichts anderes ist als ein Bereich im Speicher.
Naja ich darf wie wunderschöne Ackermann Funktion moderieren :) Ich fuchse mich da schon irgendwie rein :) Danke für deine Hilfe
 
X

Xyz1

It`s Assembler time xD
Ok, sagen wir Du möchtest x-y (Subtraktion) in Assembler berechnen

File: TutorialJNI.java
Java:
public class TutorialJNI {
	static {
		System.loadLibrary("tutorial");
	}
	private native int calculate(int x, int y);
	public static void main(String[] args) {
		System.out.println(new TutorialJNI().calculate(4, 5));
	}
}

Compile: javac -h . TutorialJNI.java
File: TutorialJNI.h (maschinell erstellt)
C:
/* DO NOT EDIT THIS FILE - it is machine generated */
#include <jni.h>
/* Header for class TutorialJNI */

#ifndef _Included_TutorialJNI
#define _Included_TutorialJNI
#ifdef __cplusplus
extern "C" {
#endif
/*
 * Class:     TutorialJNI
 * Method:    calculate
 * Signature: (II)I
 */
JNIEXPORT jint JNICALL Java_TutorialJNI_calculate
  (JNIEnv *, jobject, jint, jint);

#ifdef __cplusplus
}
#endif
#endif

File: TutorialJNI.c (Die Subtraktion in asm...)
C:
#include <jni.h>
#include "TutorialJNI.h"
#include <stdint.h>

JNIEXPORT jint JNICALL Java_TutorialJNI_calculate(JNIEnv *env, jobject thisObj, jint x, jint y)
{
    uint32_t src1 = x;
    uint32_t src2 = y;
    uint32_t dst = 42;
    asm ("movl $1, %0\n\t"
    "subl $2, %0"
    : "=r" (dst) 
    : "r" (src1, src2));
    return dst;
}

Compile: x86_64-w64-mingw32-gcc -I"C:\Program Files\Java\jdk-12.0.1\include" -I"C:\Program Files\Java\jdk-12.0.1\include\win32" -shared -o tutorial.dll TutorialJNI.c
File: tutorial.dll

Run: java TutorialJNI
Result: ...:)

Das war auch schon alles
 
X

Xyz1

Ach ICH kann den Kram auch nicht super... Aber mir fällt gerade auf dass mit Funktionsprototypen (also Funktionsaufrufen) in Assembler nicht zu spaßen ist... Das ist eventuell auch nochmal eine Nuss. ;)
 
Kirby_Sike

Kirby_Sike

Jap ich kämpfe gerade mit dem Stack....Ich glaube er mag mich einfach nicht xD Also ich bin mehr oder weniger fertig, muss halt noch irgendwie alle geretteten werde wieder vom Stack entnehmen :)
 
X

Xyz1

Oh Sorry ich habe jetzt in die PDF geschaut.... Die ganze Code Wurst oben brauchst Du nicht... das macht pHILOs bereits...

Weiterhin gutes Gelingen. :)
 
Kirby_Sike

Kirby_Sike

Also vielleicht hat mir die Ackermann Funktion einfach das Hirn frittiert...aber jetzt mal eine blöde Frage, könnte mir jemand in Worten sagen wie man überprüft ob zwei Zahlen Vielfache voneinander sind?

Beispielsweise die Zahlen 2 und 4 :)
 
Thema: 

Unterprogramme in Assembler

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben