Kleine Frage von Anfänger



  • Hi, ich versuche gerade Assembler zu lernen und bin über dieses coole Teil hier gestolpert:
    http://www.mathematik.uni-marburg.de/~thormae/lectures/ti1/ti_10_2_ger_web.html#1

    Auf Seite 11/12 ist jeweils ein Code der in etwa identisch ist. Was ich dabei nicht verstehe sind 3 Sachen:

    1. Warum wird in einem Code ebx und im anderen eax verwendet?

    2. Auf S12 nach der cmp Anweisung steht jz <funktion> aber es gibt keine Bedingung. Auf einer Seite dann das gelesen:

    Mit diesem Kommando wird zur Adresse <Sprungziel> verzweigt, falls die formulierte Bedingung erfüllt ist.

    Nach dem Vergleich wie gesagt, finde ich keine Bedingung

    3. Auf S11...
    Erste Zeile, das auskommentierte passiert automatisch?
    Dritte Zeile, hat der Push-Befehl was mit dem Hauptprogramm zu tun?



  • Wannalottadollar schrieb:

    1. Warum wird in einem Code ebx und im anderen eax verwendet?

    vermutlich Abstufungsgründe - im Stack navigiert wird normalerweise mit dem Basepointer und nicht mit dem Stackpointer. Der Text scheint leicht subversiv das Verständnis in diese Richtung (man kann - gerade als Anfänger - sehr durcheinander kommen) zu erleichtern.

    Wannalottadollar schrieb:

    2. Auf S12 nach der cmp Anweisung steht jz <funktion> aber es gibt keine Bedingung. Auf einer Seite dann das gelesen:

    Mit diesem Kommando wird zur Adresse <Sprungziel> verzweigt, falls die formulierte Bedingung erfüllt ist.

    Nach dem Vergleich wie gesagt, finde ich keine Bedingung

    doch, der Sprung selber enthält die Bedingung. Die Hexbefehle von Sprüngen bei 16bit haben oft eine Andeutung auf den eigentlichen Sinn. Was könnte der 16bit Hexbefehl 7E meinen?

    Wannalottadollar schrieb:

    3. Auf S11...
    Erste Zeile, das auskommentierte passiert automatisch?
    Dritte Zeile, hat der Push-Befehl was mit dem Hauptprogramm zu tun?

    Das ist die klassische Anlage von Unterprogrammen: Zuerst Register sichern (die betroffenen, die bearbeitet werden) dann, beim Ende des Unterprogramms den Originalzustand der manipulierten Register wiederherstellen und dann zurückspringen (mit dem Ret, die Adresse liegt nochmal wo genau?)



  • Danke, hab noch 2 Fragen zu deinen Antworten.

    2. Da es ein 16 bit Befehl ist, werden 6 bit für den Befehl und 10 bit für die Zahl verwendet? (hab das mal so mitbekommen)?

    3. Ich verstehe den Code so:

    Zeile 1: speicher 00881038h in ebx, setze eip auf nächsten Befehl
    Zeile 4: Reserviere neuen ebx-Speicher für Funktionsbasierte Variable
    Zeile 8: lösche ebx-Speicher der Funktionsbasierten Variable - also Speicheradrersse -4byte, was im ebx nun auf die vorherige zeigt, die beim Programmaufruf ins ebx geschrieben wurde
    Zeile 9: Setze Befehlzeiger auf aktuelle ebx

    So richtig?



  • für antwort 3 würd mir ein ja oder nein reichen.



  • ghjgh schrieb:

    2. Da es ein 16 bit Befehl ist, werden 6 bit für den Befehl und 10 bit für die Zahl verwendet?

    Es gelten bei 16 Bit 8 Bit für den Sprung-Befehl und 8 Bit für die Sprunglänge. Einen 16 Bit-Befehl überspringen wäre dann bei 7E -> 7EFC.

    ghjgh schrieb:

    Zeile 1: speicher 00881038h in ebx, setze eip auf nächsten Befehl

    ??
    (Es steht im Kommentar bzw. im Gesamttext, was genau passiert)