Ist folgender Code 16- oder 32-Bit? Wie kann ich ihn verwenden?

02/04/2010 - 18:11 von Jens Kallup | Report spam
Hallo,
siehe Topic, wie übersetzt man den mit NASM?
siehe "mov si, msg" - mov esi, msg ...

Danke
Jens

; - - - - - [ Dateien finden - CODE ] - - - - -
start:
mov ax, 0x2000 ; eax=0x2000
mov es, ax ; Daten werden nach ES:BX geschrieben, ES=0x2000
mov ds, ax
mov bx, 0 ; BX=0x0

loadk:
mov ah, 0x2 ; ah=2: Sektoren lesen
mov al, 0x12 ; Wie viele Sektoren wir lesen (18)
mov ch, 0 ; Cylinder 0
mov cl, 1 ; Starten bei Sektor 1
xor dx, dx ; dx=0
inc dh ; Head 1:
; Soweit ich das mitbekommen habe, besteht ein
; Cylinder aus 2 Teilen Head0 und Head1. Head0
; sind die ersten 18 Bytes (0-17) und Head1 sind
; die zweiten 18 Bytes (18-36). Da Root Entry
; auf Sektor 19 liegt, brauchen wir head1.
int 0x13 ; BIOS-Call
jc loadk ; Wenn Fehler: Nochmal

mov bx, 0x200 ; bx=Adresse des 2. Sektors, den wir in den
; Speicher gelesen haben

fat12read:
mov ah, [bx] ; ah=erstes Byte des Dateinamen
cmp ah, 0x0 ; Checken ob das Byte 0 ist: Ende der Eintràge
je endfat12read ; Wenn es das Ende ist, aufhören zum Lesen
cmp ah, 0xE5 ; Checken ob das Byte 0xE5 ist: Gelöschte Datei
je fat12next ; Wenn es eine gelöschte Datei ist: Nàchster Eintrag
push bx ; Speicher bx am Stack, weil es durch 'call putstr'
; geàndert wird

mov al, [bx+2] ; al=3. Buchstabe des Namens
test al, al ; Testen ob null
jz fat12next ; Wenn null, dann nàchster Eintrag

mov cx, 11 ; cx, weil ein Dateiname aus 11 Zeichen besteht
mov si, bx ; si=Adresse des Dateinamens im Speicher
call putstr ; Schreibe Dateiname

pop bx ; Stellt bx wieder her
fat12next:
add bx, 0x20 ; Nàchster Eintrag
jmp fat12read

endfat12read:

mov ax, 0x1000 ; es und ds aktualisieren, da wir jetzt wieder
; im Speicher auf 0x1000 arbeiten.
mov es, ax
mov ds, ax

mov cx, 0xFFFF ; cx=0xFFFF: Gibt die Stringlànge an, weil ich aber
; zu faul war, die Zeichenlànge zu überprüfen,
; hab ichs auf das höchste gestellt. Weil
; ein String aber mit 0x00 beendet wird, ist es egal
mov si, msg ; si=Adresse des Strings
call putstr ; Schreib String
mov cx, 0xFFFF ; Nochmal das Gleiche
mov si, m_boot ; Nochmal das Gleiche
call putstr ; Nochmal das Gleiche
call getkey ; Call zu GetKey
jmp reboot ; Springe zu reboot

msg db 'Welcome to SPTH-OS 1.1',0 ; String 1
m_boot db 'Press any key...',0 ; String 2

putstr: ; Schreib-Funktion
lodsb ; [si]->al
or al, al ; Teste al auf 0x0 (=Ende)
jz putstrd ; Wenn Ende des Strings, dann
mov ah, 0xE ; ah=0xE: Schreibe Zeichen
mov bx, 0x7 ; Zeichenfarbe: 0x7 = weißes Zeichen/schwarzer
; Hintergrund
int 0x10 ; call
loop putstr ; Nàchstes Zeichen
putstrd:
mov al, 13 ; Schreibe 13
mov ah, 0xE
mov bx, 0x7
int 0x10

mov al, 10 ; Schreibe 10 (13,10=Zeilenumbruch)
mov ah, 0xE
mov bx, 0x7
int 0x10
retn

getkey:
mov ah, 0 ; ah=0: Get Key BIOS Funktion
int 0x16 ; Call
ret

reboot:
db 0xEA ; Hexdump für Reboot: jmp 00FF:FF00
dw 0x0
dw 0xFFFF
; - - - - - [ Dateien finden - CODE ] - - - - -
 

Lesen sie die antworten

#1 Dirk Wolfgang Glomp
02/04/2010 - 22:50 | Warnen spam
Am Fri, 02 Apr 2010 18:11:41 +0200 schrieb Jens Kallup:

Hallo,
siehe Topic, wie übersetzt man den mit NASM?
siehe "mov si, msg" - mov esi, msg ...



Bios-Softints sind meistens für den 16 Bit-RM (ich kenne nur wenige
Ausnahmen wie wie etwa manche Bereiche im VESA-Bios der Graka, oder
Mainboards mit EFI).

Dirk

Ähnliche fragen