PrettyOS um Rechner erweitern



  • lmb schrieb:

    Naja, es wirt eax auf 0 geprüft, wenn das nicht so ist, springt er zu ungleich, ansonsten geht er weiter zu gleich. in gleich wird über ungleich auf weiter gesprungen. in ungleich soll geteilt werden und dann wieder geprüft werden.
    also muss ich theoretisch 2mal prüfen, 1mal am anfang, einmal bei ungleich nach dem dividieren.

    Vielleicht entfernst du dich besser gedanklich erst nochmal von deiner bisher gebastelten Schleife...
    Es soll nicht eax auf 0 geprueft werden, sondern der Quotient. Der steht nach der Division nur gerade in eax, vor der Division hast du also gar nichts zum Pruefen.
    Eine einzige Ueberpruefung am Ende der Schleife (quasi do{ ... } while() statt while() { }) und mit dieser einen Ueberpruefung auch nur ein bedingter Sprungbefehl, mehr brauchst du im Prinzip nicht, um diese Schleife zu basteln.
    Keine labels "gleich", "ungleich", "weiter" und auch keine tausend jmps.



  • dann meinst du bestimmt sowas hier:

    loop:
      div
      cmp eax,0
      jne loop
      ;hier gehts weiter
    


  • 👍



  • Jaaaaaaaa!
    Danke!
    Jetzt habe ich die ganze Geschichte verstanden!
    Es gibt in Assembler keine Kommazahlen, deswegen wird der Rest in dx gespeichert!
    Und ich speichere die Ziffern nacheinander in einer Variable.
    Diese wird am Ende umgedreht, sonst habe ich statt 123 halt 321.
    Jetzt schnall ich das!
    Danke!
    Und jetzt kann ich auch wieder vernünftig schreiben, habe gerade meinen Gips bis zur Schulter abbekommen!
    Ich versuch mich mal weiter dran.

    EDIT://
    Ich bin nirgendwo fündig geworden.
    Wie kann ich einem String einen weiteren String hintendran (oder besser vornedran) fügen?
    Unter dem Suchwort "String Manipulation" gab es nichts tolles...

    ;int eax in string umwandeln
            loop:
            div 10                                   ;eax/10  (Ergebnis wird in ax, Rest in dx gespeichert)
            cmp eax,0                                ;eax=0?
            jne loop                                 ;wenn eax != 0, gehe zu loop
    
            ;hier gehts weiter
    


  • lmb schrieb:

    Es gibt in Assembler keine Kommazahlen, deswegen wird der Rest in dx gespeichert!

    Nicht ganz. In Assembler kannst du natuerlich auch mit Fliesskommazahlen arbeiten. Die Sache hier ist, dass ein integer wie gesagt nur ganze Zahlen darstellen kann und du hier explizit eine Integer-Division mit Rest durchfuehrst.

    lmb schrieb:

    Wie kann ich einem String einen weiteren String hintendran (oder besser vornedran) fügen?

    Prinzip ist naheliegend: Du besorgst dir einen Pointer auf den Quellstring (bzw. im Prinzip klappt das mit jedem Datum) und einen auf den Zielstring und packst sie in 2 verschiedene Register (zB. esi und edi).
    Dann laedst du mit dem Pointer vom Quellstring (zB. mov al, [esi]), schreibst das zum Pointer beim Ziel (zB. mov [edi], al) und inkrementierst (bzw. dekrementierst) entsprechend die Pointer.
    Es gibt dazu auch noch die speziellen String-Befehle movs(b/w/d).

    Uebrigens akzeptiert div keine Konstante als Operand, sondern nur Register oder Speicheroperanden und es gibt keine Konstellation, bei der du nur eax als Dividend hast, sondern wie gesagt je nach Breite des Operanden (Divisor) entweder ax (8Bit Divisor), dx:ax (16Bit Divisor) oder edx:eax (32Bit Divisor).
    Wenn du eax als Dividend benutzen willst, musst du also darauf achten, dass edx 0 ist.



  • Nobuo T schrieb:

    Nicht ganz. In Assembler kannst du natuerlich auch mit Fliesskommazahlen arbeiten. Die Sache hier ist, dass ein integer wie gesagt nur ganze Zahlen darstellen kann und du hier explizit eine Integer-Division mit Rest durchfuehrst.

    ähh, ja klar. ich meinte natürlich den integer

    Nobuo T schrieb:

    Prinzip ist naheliegend: Du besorgst dir einen Pointer auf den Quellstring (bzw. im Prinzip klappt das mit jedem Datum) und einen auf den Zielstring und packst sie in 2 verschiedene Register (zB. esi und edi).

    OK ... jetzt steh ich wieder aufm Schlauch.
    Pointer = Pointer Register = sp, bp, ip?
    = mov ergebnis, sp?
    mov dx, bp
    mov esi, sp
    mov edi, bp ?

    Nobuo T schrieb:

    Dann laedst du mit dem Pointer vom Quellstring (zB. mov al, [esi]), schreibst das zum Pointer beim Ziel (zB. mov [edi], al) und inkrementierst (bzw. dekrementierst) entsprechend die Pointer.

    hmm, ich glaube ich habe meine hausaufgaben nicht richtig verstanden... 😞

    Nobuo T schrieb:

    Es gibt dazu auch noch die speziellen String-Befehle movs(b/w/d).

    Nixx gefunden bei Google. Was soll das sein?

    Nobuo T schrieb:

    Uebrigens akzeptiert div keine Konstante als Operand, sondern nur Register oder Speicheroperanden und es gibt keine Konstellation, bei der du nur eax als Dividend hast, sondern wie gesagt je nach Breite des Operanden (Divisor) entweder ax (8Bit Divisor), dx:ax (16Bit Divisor) oder edx:eax (32Bit Divisor).
    Wenn du eax als Dividend benutzen willst, musst du also darauf achten, dass edx 0 ist.

    also muss ich das hier machen: (?)

    mov edx, 0
    mov wert, 10
    div wert
    


  • Ist dir ueberhaupt klar, was ein Pointer oder Zeiger und eine Speicheradresse prinzipiell sind?



  • nein.
    nur die speicheradresse ist, wie der name schon sagt, eine speicherort im ram.
    dieser wird zb so angegeben 0x0000
    ich weiss auch nicht, wie man den speicherort bzw die speicheradresse ermittelt oder, was ein interrupt ist.
    ich kenne halt nur einige grundbefehle sowie die logischen programmierkenntnisse (kann man das so sagen?)

    angefangen hab ich mit basic, ich war 11
    mit 12 visual basic, seit rund einem jahr versuche ich mich in webdesign und -programmierung (php und mysql natürlich mit an bord).

    das heisst, ich bin mir mit logischen anwendungen eigentlich vertraut.
    das bit und byte system sowie hexadezimale sachen komman wohl erst in der oberstufe (bin jetzt 8. klasse gesamtschule)
    (nein, ich bin kein checker "Å£†Å WI££ ا p®ØGGE®n übE£§† ØdE®!!!!!!!!!!?????????" 😉 :D)



  • Uh, an deinem 1337-speak musst du aber auch noch arbeiten. 🤡

    Ansonsten macht das die Sache leider um einiges schwieriger. Dir scheinen wirklich die kompletten Grundlagen zu fehlen.
    Ich wuerde dir wirklich raten, erstmal einige Tutorials durchzuarbeiten, da ich fuerchte, dir entsprechende Texte zu verfassen wuerde hier ein wenig den Rahmen sprengen.



  • OK!
    Ich würde gerne auf Erhard's ASM-Tutorial zurückgreifen, aber anscheinend ist das aprupt zu Ende!?
    Könnt ihr mir was gutes Empfehlen?



  • Ich fand eigentlich das Tut von Thomas Peschko ziemlich gut.
    Sollte gerade noch [urlspieltkeinerollemehr] zu finden sein...

    edit:
    Ich sehe gerade, dass der hoster bei aol offline ist. Die unkomplizierteste Methode duerfte sein, sich beim web archive zu bedienen.
    URL ist http://web.archive.org
    Dort dann nach http://members.aol.com/peschko suchen und anschliessend noch mal nach den Links zu den pdfs suchen und herunterladen.



  • Endlich mal ein wirklick gutes Tutorial!
    Bei den anderen die ich so gesehen wird direkt losgeballert mit Code.
    Ich sehe die Welt mit anderen Augen :D!
    (Ich hab's natürlich noch nicht durch)
    Also:
    Register = eine Art "Zwischenspeicher", entweder ist der nächste Schritt der Arbeitsspeicher oder die Verarbeitung in der CPU
    Basis = Anzahl der Ziffern, die im System verwendet können (Dual/Binär: 2, Dezimal: 10, Hexadezimal 16?)



  • nicht richtig?


  • Mod

    Basis = Anzahl der Ziffern, die im System verwendet können (Dual/Binär: 2, Dezimal: 10, Hexadezimal 16?)

    Das ist nicht sauber ausgedrückt. es ist eher die Anzahl unterschiedlicher Informationen, die mit einer "Stelle", die aus n Ziffern gebildet werden kann, ausgedrückt werden können. Binär: 0 oder 1, also zwei mögliche Informationen pro Bit. Beim Dezimalsystem sind es 0...9, also zehn Möglichkeiten. Im Hexadezimalsystem entsprechend 0...F, also 16 Möglichkeiten.
    http://de.wikipedia.org/wiki/Dualsystem



  • Erhard Henkes schrieb:

    Basis = Anzahl der Ziffern, die im System verwendet können (Dual/Binär: 2, Dezimal: 10, Hexadezimal 16?)

    Das ist nicht sauber ausgedrückt. es ist eher die Anzahl unterschiedlicher Informationen, die mit einer "Stelle", die aus n Ziffern gebildet werden kann, ausgedrückt werden können.

    nö, das war schon richtig so. die basis eines zahlensystems bestimmt die anzahl verschiedener ziffern. ein zahlensystem zur basis 2 hat 2 ziffern (0,1) eins zur basis 3 hat 3 ziffern (0,1,2) und allgemein, eins zur basis b hat immer b ziffern (von 0...b-1). demnach gäbs auch ein zahlensystem zur basis 1 mit nur einer ziffer und eins zur basis 0 mit 0 ziffern (beides ist unsinnig, aber mal der vollständigkeit halber).
    🙂



  • lmb schrieb:

    Register = eine Art "Zwischenspeicher", entweder ist der nächste Schritt der Arbeitsspeicher oder die Verarbeitung in der CPU

    Jup, kann man so sagen. 🙂

    Ein (Allzweck-)Register ist in CPU ein kleiner, extrem schneller speicher, in dem man Werte zur weiteren Bearbeitung zwischenspeichert.


  • Mod

    a) Das AX Register:
    Der Akkumulator (AX Register) wird bei arithmetischen Operationen eingesetzt. Es muss auch bei der Multiplikation und Division verwendet werden.

    b) Das BX Register:
    Das Base (BX) Register wird bei Speicherzugriffen als Zeiger verwandt.

    c) Das CX Register:
    Das Count (CX) Register wird zum Beispiel in Schleifen eingesetzt. Beispiel: Eine Schleife mit dem Befehl LOOP wird so lange wiederholt, bis CX = 0 ist.

    d) Das DX Register:
    Das Data (DX) Register dient zum Beispiel zur Aufnahme von Daten bei 16 Bit Multiplikationen und Divisionen.

    http://www.assembler.my100megs.com/8086.htm



  • Dieser Thread wurde von Moderator/in Nobuo T aus dem Forum Assembler in das Forum Projekt: OS-Development verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten