Archiv verlassen und diese Seite im Standarddesign anzeigen : Daten im RAM speichern
Hallo!
Als erstes möchte ich kurz erwähnen, dass ich ziemlicher Anfänger in Sachen Assembler bin.
Ich probiere gerade so ein bisschen damit herum und wollte mal eine Diskette formatieren und dann ein paar Daten darauf speichern.
Um aber etwas auf eine Diskette zu schreiben, müsste ich ja die Stelle im RAM angeben, bei der der zukünftige Inhalt des betreffenden Sektors zu finden ist.
Mir fällt aber keine Lösung dafür ein, außer die Daten Byte für Byte in einem Register zu speichern und über PUSH in dem RAM zu stecken. Gibt es da noch eine andere Möglichkeit?
Achja, das ganze bezieht sich auf einen 386er... (Jaja, ist nicht dolle, aber für Assembler reicht es mir. Und wenn etwas kaputt geht, dann habe ich nicht viel verloren. ;-) )
Du kannst die Daten mit deinem Programm generieren. Ein Programm besteht normalerweise aus drei Bereichen:
1) Der Code-Bereich: Hier steht dein Maschinenprogramm.
2) Der Daten-Bereich: Hier stehen Daten, die bei Beginn des Programmes feststehen.
3) Der uninitialisierte Daten-Bereich: Hier hast du Platz, um Daten im Laufe deines Programmes abzulegen.
Dein Assembler hat Direktiven, um die Daten im 2.Bereich zu definieren (möglicherweise DB, DW und DD). Danach brauchst du noch einen Label (Platzhalter für eine Adresse) am Start der Daten. Der wird dann der Routine als Adresse für die Daten übergeben.
Hmmm, ich werde aus deiner Antwort leider nicht besonder schlau. :( Wie gesagt, bin ziemlicher Anfänger.
Vielleicht könntest du bitte einen kleinen Beispielcode schreiben?
Dort sehe ich vielleicht eher durch...
Hmmm, ich werde aus deiner Antwort leider nicht besonder schlau. :( Wie gesagt, bin ziemlicher Anfänger.
Vielleicht könntest du bitte einen kleinen Beispielcode schreiben?
Dort sehe ich vielleicht eher durch...
Ich könnte dir nur einen Beispielcode für einen bestimmten Assembler (in diesem Falle TASM 3.2) geben. Ich habe mit "tasm hello.asm" und "tlink /Tdc hello.obj" die COM-Datei erzeugt.
.model tiny
assume es:code, cs:code, ds:code, ss:code
code segment
startupcode
mov ah, 09h
mov dx, offset hello
int 21h
ret
hello:
db "Hello world", 13, 10, "$"
code ends
end
Die Daten werden nach dem Label hello definiert. Mit Hilfe dieses Label kann ich der Schreibroutine die Adresse übermitteln (mov dx, offset hello).
Hmmm, irgendwie bekomme ich das nicht wirklich hin. Es wird zwar auf die Diskette geschrieben, aber nicht das, was ich gerne darauf hätte.
Ich schreibe hier mal meinen Quellcode, vielleicht findest du meinen Fehler?
TITLE TEST08
CODE SEGMENT 'CODE'
ASSUME CS:CODE, SS:_Stack, DS:_Data
START:
MOV AH,03h ;Funktionsnummer Schreiben
MOV DL,00h ;Nummer des Diskettenlaufwerkes A:
MOV DH,00h ;Nummer der Diskettenseite
MOV CH,00h ;Nummer der Spur
MOV CL,01h ;Nummer des Sektors
MOV AL,01h ;Anzahl der zu beschreibenden Sektoren
MOV BX,DS
MOV ES,BX ;In ES muss das Segment mit den Daten stehen
MOV BX,offset DATEN
INT 13h ;Interrupt zum schreiben auf Diskette
JC FEHLER ;Fehler aufgetreten? -> zu Fehler springen
ENDE: CALL TON ;Gibt Piepton als Bestätigung aus, dass das Programm beendet ist
MOV AL,00h
MOV AH,4Ch
INT 21h ;Programm beenden
FEHLER: CALL TON ;Gibt einen zusätzlichen Piepton für einen Fehler aus.
JMP ENDE
TON PROC
PUSH AX
MOV AL,07h
MOV AH,0Eh
INT 10h ;Piepton ausgeben
POP AX
RET
TON ENDP
DATEN: db "EB001E4845524D414E4E3102000300010000000B40F00000001200020001B007B40ECD10CD19" ; Code der BOOT-Routine
CODE ENDS
_Stack SEGMENT STACK
DB 256 DUP (0) ;Stackgroesse 256byte
_Stack ENDS
_Data Segment
_Data ENDS
END START
Hmmm, irgendwie bekomme ich das nicht wirklich hin. Es wird zwar auf die Diskette geschrieben, aber nicht das, was ich gerne darauf hätte.
Ich könnte mir zwei Fehlerquellen vorstellen:
1) Ich glaube, dass deine Daten mit dem Programm im CodeSegment sind, weil sie zwischen CODE SEGEMENT 'CODE' und CODE ENDS stehen. Wenn das der Fall ist, dann müsste CS nach ES geschreiben werden, bevor du den INT 13h aufrufst. Oder du packst deine Daten in das DatenSegment, dann sollte es mit den bestehenden Programm funktionieren.
Bei meinem "HelloWorld"-Beispiel habe ich das Tiny-Speichermodel verwendet, da sind alles Segmente gleich (CS=DS=SS).
2) Der Code für die Boot-Routine soll wahrscheinlich Hexdaten sein!? Momentan würde eine Zeichenkette geschrieben werden. Der Bootcode sollte in der Form DATEN: db EBh, 00h, 1Eh, 48h, 45h, 52h, .... geschrieben sein.
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.