Assembler frage

hiho,

ich habe vor einer stunde mal mit assembler angefangen und dabei ist das hier herausgekommen:

Code:
jmp after_data ;damit deklarationen nicht ausgefuehrt werden
string1 db "Hallo Welt!",13,10
after_data:

mov dx,0
mov cx,12 ;zwoelf mal wiederholen, da zwoelf zeichen
mov ah,0Eh ;funktionsnummer

schleifenanfang:
mov al,[string1+dl] ;adresse des ersten buchstabens <--HIER IST DER FEHLER
inc dx ;der naechste buchstabe
int 10h
loop schleifenanfang

klar ist, dass ich in al die adresse vom string1 kopieren muss und dann noch das dl quasi als offset, das dl zeigt an, der wievielte buchstabe ab dem anfang von string1 in al kopiert werden soll (bzw. die adresse des wievielten). Dummerweise funktioniert es nicht ("reserved word used as symbol"). wenn ich allerdings [string1+2] z.B. schreibe, geht es. wie kann ich dem sagen, dass er den wert von dl dazuaddieren soll und nicht irgendwas anderes?
 
Hi,

Ist schon ne weile her, dass ich mit Assembler gearbeitet habe...

Versuchs mal mit:
Code:
mov al, byte [string1+dl]

Ansonsten hier mal ein funktionierer Code, den ich damals bei meinem Bootloader verwendet habe:

Code:
Print:
    
    mov AL, byte [SI]   ; Zeichen aus RAM laden 
    inc SI              ; 
    or AL, AL           ;
    jz short PrintEnd   ; Wenn Zeichen = 0 Routine beenden
        
        mov AH, 0x0E        ; Zeichen ausgeben mit Int 0x10
        mov BX, 0x0007      ;
        int 0x10            ;
        jmp short Print     ; Nächstes Zeichen laden
        
    PrintEnd:           ; Alle Zeichen sind Ausgegeben
    ret                 ;

Wenn das Datensegment richtig gesetzt ist muss du das einfach folgendermaßen aufrufen:

mov SI, string1
call Print

Der String muss dazu aber Nullterminiert sein, also das letze Zeichen muss 0 sein, damit der Code weiss, dass der string zu ende ist, sonst wird der Rest des Datensegements auch ausgegeben ;)

Gruß Chris
 
Hi,

lodsb funktioniert ja rech einfach: Es läd das aktuelle Byte von DS:SI in AL und erhöht SI um 1...
Also im Prinzip nur folgendes hier:
Code:
mov AL, byte [SI]
inc SI
Ich weiss leider nicht mehr warum ich das direkt geladen habe...
Das einzige was ich nocht weiss ist, dass das direkte Laden ein paar Clock Cylces schneller geht ;)

Gruß Chris
 
Zurück
Oben