Hallo Welt Programm / Anfänger braucht Hilfe^^

Hier könnt ihr sowohl zur x86 Architektur als auch zu Win32ASM Fragen stellen.

Moderatoren: crack, Krüsty, Marwin

Hallo Welt Programm / Anfänger braucht Hilfe^^

Beitragvon Gioco » Montag 6. Oktober 2008, 14:11

Hallo
Vor einiger Zeit hatten wir in der Schule mit Assembler angefangen aber ich habe irgendwie geschlafen und nichts verstanden :(.
Jetzt bin ich gerade dabei alles mal aufzuarbeiten ... aber ich habe so ziemlich keine Ahnung^^.
Ich hab mich mal hingesetzt und ein Hallo Welt Programm geschrieben.
Dabei hat sich mir aber eine Frage gestellt.
Das Programm funktioniert perfeckt wenn ich es so schreibe :
--------------------------------------------------------------------------------------------------
;Das Programm
mov DX,Offset Text ; wir laden die adresse wo der Text anfängt in DX
mov AH,09 ; im AH Register den Befehl sagen
int 021 ; den Befehl ausführen
;Programm beenden
mov AH,04c ; Der Befehl zum Programm beenden in Register laden
int 021 ; Den Befehl ausführen
;Daten
Text DB 'Hallo Welt!$' ;Die Double Byte Variable mit Inhalt initialisieren
---------------------------------------------------------------------------------------------------------
..aber wenn ich die Variable jetzt zum Beispiel direkt an den Anfang packe .. also vor die Stelle " ;Das Programm"
kommen nur "Komische Zeichen" und es bleibt stehen ...

Kann mir jemand erklären woran das liegt?
Wenn ihr noch angaben zu irgendwas braucht sagt mir Bescheid.
Ich bedanke mich schonmal hoffe ihr versteht meine Frage.

MfG Gioco :oops:
Gioco
Newbie
 
Beiträge: 1
Registriert: Montag 6. Oktober 2008, 13:56

Re: Hallo Welt Programm / Anfänger braucht Hilfe^^

Beitragvon crack » Montag 6. Oktober 2008, 23:15

Ja, doch mir ist klar was passiert ist: und zwar ist es So das das Laden von DX nur einen Teil der wahren Addresse des Textstrings repräsentiert, und zwar den Offset (relativ zur Segmentaddresse).
Und die DOS Referenz sagt zum Interupt 21h Funktion 09 (Stringausgabe auf Bildschirm) Das der String an DS:DX bis zum $ Dargestellt wird. Also musst Du noch das Segmentregister setzen (Achtung Code vereinfacht):

Code: Alles auswählen
data segment
Text db "das ist der Text$"
ends
code segment
;Das Programm
mov AX,seg Text ;manchmal, und wenn es der Assembler zulässt macht es auch
                        ;  bei .com Files Sinn expliziet Segmente zu deklarieren
mov DS,AX         ;DS kann mit 'imideates' oder Registerwerten geladen werden ;-)
mov DX,Offset Text ; wir laden die adresse wo der Text anfängt in DX
mov AH,09 ; im AH Register den Befehl sagen
int 021 ; den Befehl ausführen
;Programm beenden
mov AH,04c ; Der Befehl zum Programm beenden in Register laden
int 021 ; Den Befehl ausführen
ends


ohne Laden des Segmentregisters wir CS = DS vorrausgesetzt und damit wir anstatt der Text ein Teil des Codes gelesen und dargestellt. Und wenn es sich um ein Programm handelte das auf einen Puffer vor dem Code schreibend zugreift, kann es auch leicht zum Programmabsturz kommen ;-)
mit freundlichen grüssen,
with best regards,

crack
Benutzeravatar
crack
Administrator
 
Beiträge: 280
Registriert: Dienstag 21. Dezember 2004, 15:02
Wohnort: 53783 Eitorf


Zurück zu Assembler

 


  • { RELATED_TOPICS }
    Antworten
    Zugriffe
    Letzter Beitrag

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder

cron