ASM Hilfe ( Anfänger )



  • Hey Jungs,
    ich wollte ASM lernen zumindestens die Grundlagen und habe da auch schon mal angefangen und mich gefreut das ich 2 Strings? heisst das in ASM auch so ?
    Ausgegeben habe :
    Nachricht1 DB "Cooldie lernt ASM!"Nachricht2DB"WenndasmalnichtschiefgehtoO!" Nachricht2 DB "Wenn das mal nicht schief geht o_O!"
    Wie mache ich da hinter eine leer Zeile ? Damit das nicht alles in einer Reihe steht dann habe ich noch eine Frage wie deklariere ich eine Variable wo ich eine Zahl rein speichern kann um damit evtl. zu rechnen und wie gebe ich die nacher aus ?
    Und nun das allerletzte kann ich wie in C++ mit cin >> Eingabe; Irgendwie Tastatur eingeben auslesen ?

    Das wars erstmal.

    Gruß cooldie



  • Dummie schrieb:

    Hey Jungs,
    ich wollte ASM lernen zumindestens die Grundlagen und habe da auch schon mal angefangen und mich gefreut das ich 2 Strings? heisst das in ASM auch so ?

    ja in asm heißt das auch string 🙂

    Dummie schrieb:

    Nachricht1 DB "Cooldie lernt ASM!"Nachricht2DB"WenndasmalnichtschiefgehtoO!" Nachricht2 DB "Wenn das mal nicht schief geht o_O!"
    Wie mache ich da hinter eine leer Zeile ? Damit das nicht alles in einer Reihe steht?

    mach einfach
    Nachricht1 DB "Cooldie lernt ASM!",0Dh,0AhNachricht2DB"WenndasmalnichtschiefgehtoO!", 0Dh, 0Ah Nachricht2 DB "Wenn das mal nicht schief geht o_O!"
    wenn du willst dass ein string nullterminiert ist dann machst du einfach ,00h hinter den string.

    Dummie schrieb:

    dann habe ich noch eine Frage wie deklariere ich eine Variable wo ich eine Zahl rein speichern kann um damit evtl. zu rechnen und wie gebe ich die nacher aus

    vor deinen .code block schreibst du .data? fuer variabeln die zu programmstart noch nicht initialisiert sein sollen z.b.

    .data?
    bla db ? ;ein BYTE
    blaa dw ? ;ein WORD
    blaaa dd ? ; ein DWORD

    fuer initialisierte variablen machst du z.b.

    .data
    bla db 11h
    blaa dw 1111h
    blaaa dd 11111111h

    ausgeben kannst du die variabeln dann z.b. mit printf

    Dummie schrieb:

    Und nun das allerletzte kann ich wie in C++ mit cin >> Eingabe; Irgendwie Tastatur eingeben auslesen ?

    ja das geht auch such einfach mal im forum.



  • Danke hat mir schonmal geholfen aber ,wie meinst du das mit printf ?
    Geht das auch ohne Inline C/C++ ?

    Gruß cooldie



  • Habe nun nochmal getestet aber funktioniert nicht hier mein Gesamter Code :

    .MODEL Small             ;wir basteln eine COM Datei :)
        .STACK 100h              ;100h (im Dezimalen 255) gibt die GrӇe des Stacks an
    
        .DATA  ;hier beginnt der Datenabschnitt
    
    	Nachricht1 DB "Cooldie lernt ASM!$", 0Dh, 0Ah 
    	Nachricht2 DB "Wenn das mal nicht schief geht o_O!$" 
    
    	bla db 11h 
    	blaa dw 1111h 
    	blaaa dd 11111111h 
    
        .CODE                    ;hier beginnt das Codeabschnitt
    Start:                       ;Einsprungspunkt (wo gestartet wird)
                                 ;zuerst mssen wir mal unser Datensegment vorbereiten
    
        mov ax,@data             ;die Adresse des Datenabschnittes ins Register AX
        mov ds,ax                ;dem Datensegment die Adresse der Daten mitteilen
        mov dx,OFFSET Nachricht1  ;die Adresse der Nachricht dem Datenregister mitteilen
        mov ah,09h               ;ins Register AH die Funktion 9 reinschreiben, die wir brauchen
        int 21h                  ;die Funktion (9=Text ausgeben) im Register AH ausfhren
        mov dx,OFFSET Nachricht2  ;die Adresse der Nachricht dem Datenregister mitteilen
        mov ah,09h               ;ins Register AH die Funktion 9 reinschreiben, die wir brauchen
        int 21h                  ;die Funktion (9=Text ausgeben) im Register AH ausfhren
    
        mov dx,OFFSET bla  ;die Adresse der Nachricht dem Datenregister mitteilen
        mov ah,09h               ;ins Register AH die Funktion 9 reinschreiben, die wir brauchen
        int 21h                  ;die Funktion (9=Text ausgeben) im Register AH ausfhren
    
        mov ah,4Ch               ;nun schreiben wir die Funktion 4C (Beenden) nach AH
        int 21h                  ;Funktion im Register AH ausfhren
    
    END Start                    ;Ende des Einsprungpunktes angeben
    

    Vielleicht fällt dir was auf:

    mov dx,OFFSET bla  ;die Adresse der Nachricht dem Datenregister mitteilen
        mov ah,09h               ;ins Register AH die Funktion 9 reinschreiben, die wir brauchen
        int 21h                  ;die Funktion (9=Text ausgeben) im Register AH ausfhren
    

    War nur ein TEst ob man die Variable vielleicht so ausgeben kann 🙄

    Gruß cooldie

    EDIT : Übringes Funktioniert das mit der Leer Zeile nicht so ???



  • uuh 16 bit code 😕 ehrlich gesagt hab ich damit noch nie was gemacht.aber ich versuchs trotzdem mal.damit das mit der neuen zeile nach der ersten nachricht funktioniert musst du den string so machen Nachricht1 DB "Cooldie lernt ASM!", 0Dh, 0Ah,""weilderstringwennduihnmiteinemint21hausgebenwillstscheinbarimmermit" weil der string wenn du ihn mit einem int 21h ausgeben willst scheinbar immer mit '' enden muss.
    bla kannst du so nicht ausgeben weil bla noch kein string ist.du musst es vorher mit wsprintf in einen string umwandeln:
    .data
    fmt db "%lX", 00h
    buf db 4 dup (24h) ;24h == $
    ...
    invoke wsprintf, addr buf, addr fmt, bla
    mov dx,OFFSET buf
    mov ah,09h
    int 21h

    ich glaube so sollte es funktionieren kann es leider nicht testen weil mein pc im eimer ist hoffe es hilft dir trotzdem ein bisschen.



  • Hi.

    Dummie schrieb:

    Danke hat mir schonmal geholfen aber ,wie meinst du das mit printf ?
    Geht das auch ohne Inline C/C++ ?

    Also ich weiss zwar auch nicht wie er das gemeint hat, aber da ein Compiler letztendlich auch nichts anderes macht, als den Hochsprachencode in Assembler(/Maschinencode) zu uebersetzen, geht das logischerweise auch ohne C++. 😉

    Um Zahlen auszugeben, musst du sie (wie the_rain schon sagte - wie das mit dem invoke ohne weitere Libs unter DOS funktionieren soll, ist mir dagegen nicht ganz klar... 😕 ) erstmal in Strings umwandeln - erst dann kannst du sie mit der Funktion 09h vom int 21h ausgeben.

    Am einfachsten ist es IMHO unsigned integer in einen String mit Hex-Zahlen zu konvertieren.

    Im grunde genommen funktioniert das so, dass du zunaechst die hintersten 4bit (von links nach rechts gelesen kommt die entsprechende Ziffer schliesslich zuerst auf den Bildschirm) irgendwie isolierst und dann zB. als einen Index auf einen String benutzt, der sinnvollerweise in etwa so aussieht: "0123456789ABCDEF". Den entsprechenden Letter kopierst du dir dann in den String, den du ausgeben willst, und isolierst die naechst 4Bit.

    Um das zu realisieren, solltest du wissen, wieviele Register es gibt, wie die bitweise "and"-verknuepfung, Bitshift (rol/shl ..., 4) und indirekte Adressierung (via Register) funktioniert und wie man Schleifen implementiert (vor allem fuer (d)words waere das sinnvoll).

    Dummie schrieb:

    .MODEL Small             ;wir basteln eine COM Datei :)
    

    Nur mal so nebenbei: KA, wie das beim MASM ist (falls du den benutzt), aber in TASM bekommt man AFAIK so keine .com-Datei.
    Aber du wirst vermutlich so oder so eine .exe erstellt haben.

    Dummie schrieb:

    EDIT : Übringes Funktioniert das mit der Leer Zeile nicht so ???

    Funktion 09h vom int 21h beendet die Stringausgabe bei einem "".LogischerweisesolltestdudieSteuerCharsfuerdenZeilenwechselvordas"". Logischerweise solltest du die Steuer-Chars fuer den Zeilenwechsel vor das "" packen.

    the_rain schrieb:

    wenn du willst dass ein string nullterminiert ist dann machst du einfach ,00h hinter den string.

    Jo, und genauso sind deine Strings eben "$"-Terminiert.



  • Hallo,
    Die Leerzeilen funktionieren nun Prima aber dieser Fehler macht mir Sorgen :

    error A2006: undefined symbol : wsprintf

    Im Übrigen verstehe ich das hier nicht :

    data 
    fmt db "%lX", 00h 
    buf db 4 dup (24h) ;24h == $ 
    ... 
    invoke wsprintf, addr buf, addr fmt, bla 
    mov dx,OFFSET buf 
    mov ah,09h 
    int 21h
    

    Kennt ihr für mich noch ein paar gute Bücher , Tutorials ?
    Damit ich mich da etwas vertiefen kann 😃

    Gruß cooldie :p

    Edit : Ja es ist eine EXE keine Ahnung warum da Com steht, benutze übrigens MASM.



  • den fehler error A2006: undefined symbol : wsprintf bekommst du weil du das .lib file und das .inc file nicht includiert hast wie Nobuo T auch schon bemerkt hat. hab ich vergessen zu sagen. schreibe zwischen .stack und .data gerade noch
    include \masm32\include\user32.inc
    includelib \masm32\lib\user32.lib
    du musst vllt den pfad noch aendern.
    den code den du nicht verstehst soll mit hilfe von wsprintf bla in einen string umwandeln der dann in buf steht.danach koenntest du dann den string ausgeben.
    vor wsprintf sieht buf so aus '$$$$' nach wsprintf sollte buf dann so aussehen '11 $'.
    gute tutorials findest du z.b. hier http://win32asm.cjb.net/



  • Er schreibt ein DOS-Programm und soll mit user32.lib linken? 😕 😕 😕



  • Unter DOS koennte er auch die C-Library verwenden (also Funktionen wie printf(), scanf() usw., oder gar cprintf() usw.).

    Das ist vermutlich einfacher, als ueber die DOS- bzw. BIOS-Interrupts zu gehen.

    Wie man mit DOS / mit dem BIOS Zeichen einliest, steht uebrigens in einer DOS- bzw. BIOS-Interrupt-Tabelle, die man im Netz finden kann.

    Um Zahlen zu Strings zu konvertieren, dividiert man (fuers Dezimalsystem) eine Zahl durch 10, addiert zum Divisionsrest 48 ('0') dazu, gibt das Zeichen aus, und wiederholt, bis die Zahl 0 ist. Um auch negative Zahlen ausgeben zu koennen, muss man vorher das Vorzeichen pruefen, dann ggf. ein Minuszeichen ausgeben, und die Zahl negieren, bevor sie ausgegeben wird.


Anmelden zum Antworten