Autor Thema: kann im bootloader nicht schreiben  (Gelesen 6598 mal)

Jiba

  • Beiträge: 6
    • Profil anzeigen
Gespeichert
« am: 22. June 2006, 23:06 »
ich hab das erste tutorial mal nachgebaut und mich gewundert das im bootloader die strings nicht ausgegeben werden.

dann hab ich rausgeschmissen was nicht wichtig ist und hab gemerkt
das ich zwar so ein A ausgeben kann

; >>A<< ausgeben
...
   mov al, 0x41 //ascii wert für 'A'
   mov ah, 0x0E
   mov bx, 0x0007
   int 0x10

aber nicht so:

; msg ausgebn
...
jmp start:
daten:
db msg 0x41 //ascii wert für 'A'
...
start:
   mov al, msg
   mov ah, 0x0E
   mov bx, 0x0007
   int 0x10

woran kann das liegen?

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #1 am: 22. June 2006, 23:46 »
Das liegt daran, dass der BIOS Interrupt nur _ein_ Zeichen ausgibt welches sich in AL befindet. Beim zweiten Codestück übergibst du dem BIOS Int in AL aber nur einen Zeiger auf eine Zeichenkette. Das BIOS hält dann den Zeiger für den ASCII Wert eines Zeichens und versucht diesen auszugeben => Murks.
Du musst wenn du eine Zeichenkette ausgeben willst nen loop machen und dann jedes Zeichen einzeln über den int 0x10 ausgeben.

btw. Bitte Codetags benutzen :!:
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

Jiba

  • Beiträge: 6
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 23. June 2006, 00:10 »
ich kapier das mit der adressierung nicht richtig wie komme ich den an den wert der adresse in msg? ich hab es mit [msg] probiert aber das klappt auch nicht.

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #3 am: 23. June 2006, 00:18 »
Zitat von: Jiba
ich kapier das mit der adressierung nicht richtig wie komme ich den an den wert der adresse in msg? ich hab es mit [msg] probiert aber das klappt auch nicht.


Du wirst doch schonmal was von Pointern gehört haben, oder :?: Ansonsten lern programmieren :roll:


mov bx, msg ; Adresse der Message nach bx
mov al, [bx] ;erstes Zeichen nach al
inc bx
mov al, [bx] ;jetzt zweites Zeichen nach al


edit: sry, bin 32bit gewöhnt
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

Jiba

  • Beiträge: 6
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 23. June 2006, 00:19 »
ich hab mir mein asm buch zur gemüte geführt.
ich verstehe das so:
auf einen wert greift man standardmäsig so zu

zeichen db 'A'
mov al, DS:[zeichen]

auch wenn mann das schreibt:

zeichen db 'A'
mov al, [zeichen]

ich hab DS nicht gesetzt und weiß auch nicht welche adresse da rein muss

bluecode

  • Beiträge: 1 391
    • Profil anzeigen
    • lightOS
Gespeichert
« Antwort #5 am: 23. June 2006, 00:21 »
siehe oben
Was du da machst ist einfach den Wert einer Variable in ein Register zu übertragen, da kann man das Segmentregister DS weglassen, da standardmäßig (also wenn nix dransteht) auch genommen wird.
Was du aber benutzten musst sind Pointer :wink:
lightOS
"Überlegen sie mal 'nen Augenblick, dann lösen sich die ganzen Widersprüche auf. Die Wut wird noch größer, aber die intellektuelle Verwirrung lässt nach.", Georg Schramm

Jiba

  • Beiträge: 6
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 23. June 2006, 00:43 »
dann müsste ja folgendes programm klappen oder?

   org 0x7C00 ; startadresse

   jmp start

; daten
data:
msg   db 65

; bootloader start
start:

; stack bauen
   mov bx, msg
   mov al, [bx]

   call printchar

   mov al, 66
   call printchar

   call getkey

; bootloader ende
   jmp reboot

; giebt einen buchstaben aus al aus
printchar:
   mov ah, 0x0E
   mov bx, 0x0007
   int 0x10
ret

; auf tastendruck warten
getkey:
   mov ah, 0
   int 16h   
ret

; reboot
reboot:
   db 0EAh
   dw 00000h
   dw 0FFFFh

; bootsektor füllen
   times 512-($-$$)-2 db 0   ; dateilänge: 512 Bytes
   dw 0AA55h                 ; bootsignatur

Jidder

  • Administrator
  • Beiträge: 1 625
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 23. June 2006, 00:45 »
Zitat von: Jiba
ich hab DS nicht gesetzt und weiß auch nicht welche adresse da rein muss

DS muss den Wert 0 haben.

Ja, das Programm müsste klappen, wenn DS = 0.
Dieser Text wird unter jedem Beitrag angezeigt.

Jiba

  • Beiträge: 6
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 23. June 2006, 00:45 »
der eine kommentar ist falsch stack bauen

Jiba

  • Beiträge: 6
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 23. June 2006, 00:54 »
danke es klappt ich kann A und B ausgeben

im tutorial wurde DS auch nicht gesetzt das dachte das muß so

sollte man wohl mal ändern

Thoth

  • Beiträge: 62
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 23. June 2006, 18:33 »
Ich würde ganz allgemein sagen, dass man sich nie auf irgendein Register verlassen sollte, das man nicht selber gesetzt hat oder von einer Routine, der man vertraut setzen lassen hat (und selbst in dem Fall würde ich das nochmal überprüfen).
Madness isn't a bug - it's a feature

 

Einloggen