Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: Jiba 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?
-
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 :!:
-
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.
-
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
-
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
-
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:
-
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
-
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.
-
der eine kommentar ist falsch stack bauen
-
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
-
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).