Assembler verstehen!!!



  • hehe, danke jetzt funktioniert es schonmal zu assemblen und linken, aber das Programm gibt 5 mal Hallo Welt aus, aber dazwischen ist immer voll viele Leerzeichen und so Smilies und andere Zeichen, sieht aus wie Müll aus dem Speicher. Bist du dir sicher, dass das Programm so richtig ist? Oder ist das geplant, das da noch so komische andere Zeichen drin sind (es piept auch nen paar mal durch den PC-Speaker *g*, das liegt w*****einlich an den nicht darstellbaren Zeichen). Ich benutze Windows XP (Hello World Programm aus meinem Buch funzte) und TASM 5



  • Wahrscheinlich falsch gelinkt, denn bei mir lief es. :p
    Ich habe folgende Optionen zum Erstellen benutzt:
    TASM /MU /OS /Q Drive:\\Path\\Infile.asm Drive:\\Path\\Infile.obj
    TLINK Drive:\\Path\\Infile.obj /x /Tdc



  • lol, thx 2 nobuo! woher sollte man das wissen mit den ganzen optionen? die stehen zwar beschrieben, aber wär ich trotzdem nie drauf gekommen :p

    in meinem buch "strukturierte einführung" (bin erst kurz nach dem hallo welt programm) musste ich's einfach nur so machen:

    tasm hello
    tlink hello



  • axo, jetzt ist es irgendwie ne com datei geworden, davor hatte ich ne exe datei bekommen 🙂



  • jup. Das sollte auch so sein. Der code war fuer eine .com-Datei gedacht. 😉



  • du musst das Endzeichen angeben, damit der Computer weiß wo das Ende des Strings ist.

    zB so

    .MODEL SMALL
                    .STACK 100h
                    .DATA
    HalloMeldung    DB      'Hallo, Welt',13,10,'$'
    
                    .CODE
                    mov     ax,@data
                    mov     ds,ax           ; DS zeigt auf das Datensegment
                    mov     ah,9            ; DOS-Funktion String-Ausgabe
                    mov     dx,OFFSET HalloMeldung
                                            ; Zeiger auf Hallo Welt
                    int     21h             ; Ausgabe Hallo Welt
                    mov     ah,4Ch          ; DOS-Funktion Programmende
                    int     21h             ; Programm beenden
                    END
    

    hier sind noch 2 Beispiele

    .MODEL SMALL
                    .STACK 100h
                    .DATA
    Tageszeitfrage  DB      'Ist es Nachmittag (J/N)?$'
    GutenMorgenGruss LABEL BYTE
                    DB      13,10,'Guten Morgen',13,10,'$'
    GutenTagGruss   LABEL BYTE
                    DB      13,10,'Guten Tag',13,10,'$'
                    .CODE
                    mov     ax,@data
                    mov     ds,ax           ; DS zeigt auf das Datensegment
                    mov     dx,OFFSET Tageszeitfrage
                                            ; Zeiger auf Tageszeitfrage
                    mov     ah,9            ; DOS-Funktion Stringausgabe
                    int     21h             ; Ausgabe der Frage
                    mov     ah,1            ; DOS-Funktion, Zeihchen lesen
                    int     21h             ; Zeichen lesen
                    cmp     al,'j'          ; Mit 'j' beantworten?
                    je  Nachmittag      ; Ja, es ist nachmittags
                    cmp     al,'J'          ; Mit 'J' beantworten?
                    jne     Vormittag       ; Nein, es ist vormittags
    Nachmittag:
                    mov     dx, OFFSET GutenTagGruss
                    jmp     GrussAnzeigen
    Vormittag:
                    mov     dx,OFFSET GutenMorgenGruss
    GrussAnzeigen:
                    mov     ah,9            ; DOS-Funktion Stringausgabe
                    int     21h             ; Ausgabe des Gruáes
                    mov     ah,4Ch         ; DOS-Funktion Programmende
                    int     21h             ; Programm beenden
                    END
    
                    mov     ah,4Ch          ; DOS-Funktion Programmende
                    int     21h             ; Programm beenden
                    END
    
    .MODEL SMALL
                    .STACK 100h
                    .DATA
    MAX_STRING  EQU 1000
    StringUmzudrehen    DB  MAX_STRING DUP (?)
    UmgedrehterString   DB  MAX_STRING DUP (?)
    
            .CODE
            mov ax,@data
            mov ds,ax       ; DS zeigt auf das Datendegment
            mov ah,3Fh      ;DOS-Funktion: über Handle
                        ; lesen
            mov bx,0        ; ********eingabegerät
            mov cx,MAX_STRING
                        ; Maximale Anzahl an Zeichen
            mov dx,OFFSET StringUmzudrehen
                        ; String hier speichern
            int 21h     ; String lesen
            and ax,ax       ; Zeichen gelesen?
            jz  Fertig      ;Alles klar
            mov bx,OFFSET StringUmzudrehen
            mov si,OFFSET UmgedrehterString
            add si,cx       ; Zeiger auf das Stringende
            dec si      ; des umgedrehten Strings
    Umdrehen:
            mov     al,[bx]     ; Zeichen holen
            mov [si],al     ; Zeichen umgekehrt abspeichern
            inc bx      ; Zeiger zum nächsten Zeichen
            dec si      ; Zeiger zum vorherigen Zeichen
            loop Umdrehen       ; Nächstes Zeichen,
                        ; falls vorhanden
            pop cx      ; Stringlänge zurückholen
            mov ah,40h      ; DOS über Hndle schreiben
            mov bx,1        ; ********ausgabegerät
            mov dx,OFFSET UmgedrehterString
                        ; Zeiger auf den umgedrehten
                        ; String
            int 21h     ; String ausgeben
    Fertig:
            mov ah,4Ch      ; DOS-Funktion Programm beenden
            int 21h     ; Programm beenden
            END
    


  • Das "Endzeichen" ""gilteigentlichnurfuerah=09h,int21hDesweiterenistderASCIIcodevon"" gilt eigentlich nur fuer ah=09h, int 21h Des weiteren ist der ASCII-code von "", 24h oder auch 36 (dec)



  • mal zur frage was man mit registern macht. eigentlich daten speichern und verarbeiten. ( ist die schnellste möglichkeit. wenn ma die daten in den registern ablegen kann)

    bezie mich mal auf den 8086 ( den sogenanten uhrfater )

    ax, bx, cx, dx sind universalregister, mit denen man so zimlich alles machen darf. werte reinschreiben und auslesen, und manipuliren, ohne das da schlimmeres passiert. ggf müssen bei bestimten befehlen, in bestimmten register die operanden stehen ( z.b. mull, div )

    cs, ip (code segment und instruction pointer)sind zur bestimmung der momentanen programmposition. wird nach jedem befehl verändert ( ip ) bzw bei jedem sprung ( ip und cs )

    ss, sp (stack segment und stack pointer) sind zum arbeiten mit dem stack notwendig. die befehler push, pop, int, ret, iret greifen darauf zu und manipulieren ihn.

    ds (data segment) ist der segemnt zeiger/selektor auf das datensegment, mit dessen hilfe lassen sich meist varialben im speicher adressieren,( geht auch teilweise mit es)

    es ( extra segment) ein zusätzlicher segment zeiger/selektor wird nur bei ganz bestimmten sachen benötigt, steht sonsten zur freihen verfügung

    PSW ( programm status word) hir werden informationen über ergebnisse der letzten operation gespeichert, sowie einstellungen am prozessor vorgenommen, sind zum beispiel interrupte erlaubt oder nicht, oder war das ergebnis der letzten operation gleich 0, ist bei der addition ein überlauf aufgetreten, oder ein vorzeichenwechsel, ....

    so nun hör ich mal mit meiner kleinen registerkunde auf. ich hoffe das ich keine vergesen hab.

    gruss termite



  • Original erstellt von Termite:

    so nun hör ich mal mit meiner kleinen registerkunde auf. ich hoffe das ich keine vergesen hab.

    Doch, hast du. 😃
    Und zwar SI (source index), DI (destination index) und das FLAGS Register.
    Ach ja, 'Urvater' schreibt man nicht 'Uhrfater' 😉



  • hab mich schon gewunder das das nur 2 indexregister waren, und 4 segment register

    CS:IP
    SS:SP
    DS:DI
    ES:SI

    und das flag register nent sich soweit ich weis auch PSW ( program status word)

    dank für die korrektur malfunction


Anmelden zum Antworten