Beiträge anzeigen

Diese Sektion erlaubt es dir alle Beiträge dieses Mitglieds zu sehen. Beachte, dass du nur solche Beiträge sehen kannst, zu denen du auch Zugriffsrechte hast.


Nachrichten - bsunisol

Seiten: [1]
1
haa
ich hab den fehler gefunden.
im linkerscript muss stehen

text 1200 und nicht 200 wie bei mir....


danke für die schnellen antworten.
2
ähhh ja ich kann nur nicht viel mit dem ganzen krams anfagen.....

BINARIES\tmp\OSLDRC.obj:     file format coff-go32

SYMBOL TABLE:
[  0](sec -2)(fl 0x00)(ty   0)(scl 103) (nx 1) 0x00000000 OSLDRC.c
File
[  2](sec  1)(fl 0x00)(ty  24)(scl   2) (nx 1) 0x00000004 _main
AUX tagndx 0 ttlsiz 0x1e lnnos 410 next 10
_main :
   2 : 0x8
   4 : 0x10
   5 : 0x15
   8 : 0x1e
[  4](sec  1)(fl 0x00)(ty   0)(scl 101) (nx 1) 0x00000004 .bf
AUX lnno 6 size 0x0 tagndx 0 endndx 12
[  6](sec -2)(fl 0x00)(ty  32)(scl   1) (nx 1) 0xfffffffc _Text
AUX lnno 0 size 0x4 tagndx 0
[  8](sec  1)(fl 0x00)(ty   0)(scl 101) (nx 1) 0x00000022 .ef
AUX lnno 8 size 0x0 tagndx 0
[ 10](sec  1)(fl 0x00)(ty  21)(scl   2) (nx 1) 0x00000022 _printf
AUX tagndx 0 ttlsiz 0x34 lnnos 440 next 18
_printf :
   2 : 0x28
   3 : 0x2d
   4 : 0x34
   3 : 0x35
   4 : 0x37
   5 : 0x45
   6 : 0x49
   8 : 0x54
[ 12](sec  1)(fl 0x00)(ty   0)(scl 101) (nx 1) 0x00000022 .bf
AUX lnno 24 size 0x0 tagndx 0 endndx 20
[ 14](sec -2)(fl 0x00)(ty  12)(scl   9) (nx 0) 0x00000008 _t
[ 15](sec -2)(fl 0x00)(ty  12)(scl   4) (nx 0) 0x00000001 _t
[ 16](sec  1)(fl 0x00)(ty   0)(scl 101) (nx 1) 0x00000056 .ef
AUX lnno 8 size 0x0 tagndx 0
[ 18](sec  1)(fl 0x00)(ty  21)(scl   2) (nx 1) 0x00000056 _clrscr
AUX tagndx 0 ttlsiz 0x23 lnnos 494 next 25
_clrscr :
   3 : 0x57
   1 : 0x59
   2 : 0x5b
   6 : 0x65
   8 : 0x77
[ 20](sec  1)(fl 0x00)(ty   0)(scl 101) (nx 1) 0x00000056 .bf
AUX lnno 34 size 0x0 tagndx 0
[ 22](sec -2)(fl 0x00)(ty   4)(scl   4) (nx 0) 0x00000002 _i
[ 23](sec  1)(fl 0x00)(ty   0)(scl 101) (nx 1) 0x00000079 .ef
AUX lnno 8 size 0x0 tagndx 0
[ 25](sec  1)(fl 0x00)(ty   0)(scl   3) (nx 1) 0x00000000 .text
AUX scnlen 0x79 nreloc 7 nlnno 20
[ 27](sec  2)(fl 0x00)(ty   0)(scl   3) (nx 1) 0x00000080 .data
AUX scnlen 0x4 nreloc 0 nlnno 0
[ 29](sec  3)(fl 0x00)(ty   0)(scl   3) (nx 1) 0x00000090 .bss
AUX scnlen 0x0 nreloc 0 nlnno 0
[ 31](sec  4)(fl 0x00)(ty   0)(scl   3) (nx 1) 0x00000090 .comment
AUX scnlen 0xf nreloc 0 nlnno 0
[ 33](sec  2)(fl 0x00)(ty  12)(scl   2) (nx 0) 0x00000080 _VidMem
3
hmm geht trotzdem nicht.
gleiche sache wie vorher....
4
hallo,
ich habe mein problem aus dem letzten thread gelöst....
jetzt habe ich ein neues, und zwar:

bochs spring ordnungsgemäß in den c kernel und führt ihn aus.
nur stimmen meine pointer/variablen adressen nicht.
schaut es euch selber an:

char* VidMem = (char*)0x0B8000;
void printf( char* t );
void clrscr();


int main() {
char Text[] = "ABC";

clrscr();
printf( Text );

return 0;
}


void printf( char* t ) {
while( *t ){
*VidMem = *t;
t++; VidMem++;
*VidMem = 0x07;
VidMem++;
}
}


void clrscr() {
VidMem = (char*) 0x0B8000;
int i = 0;

while( i < 4000 ) {
VidMem[i++] = 0;
}
}

das bildschirmlöschen funktionniert. aber er gibt nur ein großes S auf dem bildschirm aus. macht aber keine fehlermeldung.

wenn ich per debugger durch gehe dann sagt er mir, er würde für den string die adresse 210 nehmen.....

hier mein linker script:

OUTPUT_FORMAT("binary")
INPUT(BINARIES\OSLDR32.obj BINARIES\OSLDRC.obj)
ENTRY(start)
SECTIONS
{
  .text  0x200 : {
    code = .; _code = .; __code = .;
    *(.text)
    . = ALIGN(1);
  }
  .data  : {
    data = .; _data = .; __data = .;
    *(.data)
    . = ALIGN(1);
  }
  .bss  :
  {
    bss = .; _bss = .; __bss = .;
    *(.bss)
    . = ALIGN(1);
  }
  end = .; _end = .; __end = .;
}

mfg und danke im voraus
Uni_Sol
5
Lowlevel-Coding / sprung in den pmode klappt nicht.
« am: 12. March 2007, 11:47 »
hi leute,
kann mir einer von euch helfen warum der pmode jump nicht geht?

ich habe einfach nur leerzeilen und einen platzhalter per times aus dem src gelöscht, und plötzlich will er nicht mehr.

das label pmode erreicht er garnicht mehr. nach dem jump ist feierabend...
weiß einer weiter?

hier der code:

osloader.asm%include "../PRJ/SRC/includes/macros.asm"

[ORG 0x1000]
[BITS 16]
[CPU 386]

CODE_SECTION:
mov ax, 0x1000 ; update registers
mov es, ax
mov ds, ax

A20Gate: in al, 0x64
test al, 00000010b
jnz A20Gate ; loop till buffer is empty

mov al, 0xD0
out 0x64, al ; send read order

wait_1: in al, 0x64
test al, 00000001b
jz wait_1 ; wait till inst. is done

in al, 0x60
or al, 00000010b
mov bl, al ; set A20 and store in bx

wait_2: in al, 0x64
test al, 00000010b
jnz wait_2 ; loop till buffer is empty

mov al, 0xD1
out 0x64, al ; send write order

wait_3: in al, 0x64
test al, 00000010b
jnz wait_3 ; loop till buffer is empty

mov al, bl
out 0x60, al ; send A20 to controller

table: mov [GDT_START   ], word 0x00 ; DESC_0
mov [GDT_START+ 2], word 0x00
mov [GDT_START+ 4], word 0x00
mov [GDT_START+ 6], word 0x00

mov [GDT_START+ 8], word 0xFFFF ; DESC_1 (CODE)
mov [GDT_START+10], word 0x0000
mov [GDT_START+12], byte 0x00
mov [GDT_START+13], byte 0x9A
mov [GDT_START+14], byte 0xCF
mov [GDT_START+15], byte 0x00

mov [GDT_START+16], word 0xFFFF ; DESC_2 (DATA)
mov [GDT_START+18], word 0x0000
mov [GDT_START+20], byte 0x00
mov [GDT_START+21], byte 0x92
mov [GDT_START+22], byte 0xCF
mov [GDT_START+23], byte 0x00

mov eax, cs ; set ds = cs
mov ds, ax

sub esp, 0x06 ; setting up gdt by stack-
mov [esp  ],  word GDT_SIZE ; usage
mov [esp+2], dword GDT_START

lgdt [esp] ; load descriptor in GDT

add esp, 0x06 ; reset stack

enterpm: mov eax, cr0 ; set pmode bit to 1
or eax, 0000001b
mov cr0, eax

jump: db 0xEA ; far-jump in pmode
dw pmode ; jmp dword 0x08:ende
dw 0x08

pmode: mov eax, 0x10
; mov eax, 0x02
; shl eax, 3
mov ds, ax
mov es, ax
mov ss, ax
xor eax, eax
mov fs, ax
mov gs, ax
mov esp, 0x1FFFFF


und hier noch die bochsout.txt:

00003894733-e-@000010ba-[CPU0 ] check_cs: conforming code seg descriptor dpl > cpl
00003894733-e-@000010b5-[CPU0 ] interrupt(): gate descriptor is not valid sys seg
00003894733-e-@000010b5-[CPU0 ] interrupt(): gate descriptor is not valid sys seg
00003894733-i-@000010b5-[CPU0 ] protected mode
00003894733-i-@000010b5-[CPU0 ] CS.d_b = 16 bit
00003894733-i-@000010b5-[CPU0 ] SS.d_b = 16 bit
00003894733-i-@000010b5-[CPU0 ] >> jmp far 0008:10ba : EABA100800
00003894733-e-@000010b5-[CPU0 ] exception(): 3rd (13) exception with no resolution, shutdown status is 00h, resetting
00003894733-i-@000010b5-[SYS  ] bx_pc_system_c::Reset(SOFTWARE) called
6
Lowlevel-Coding / vesa text mode
« am: 20. January 2007, 15:19 »
hallo,
kann mir einer sagen wie ich die vesa text modes verwende?

kann ich dann wie im standart textmode text ausgeben? oder muss ich dann da irgendwelche speziellen funktionen verwenden?

mfg und danke im voraus.
7
Lowlevel-Coding / Bootsektor
« am: 03. June 2006, 21:16 »
lasst mich auch was zu den thema schreiben.
es ist mit den zahlen wie mit politikern:
führende nullen kann man streichen! (ist so auch in manchen mathebüchern als merksatz formuliert)

das ist auch bei compilern/assemblern so.
8
sry, aber geht immer noch nicht.....
egal ob ich "[]" benutze oder nicht. er rechnet nur müll aus

xor dx, dx
         mov ax, LBA
div WORD [SecPerTrack]
         inc dl
         mov [Sector], dl
         mov [LBA], ax
         xor dx, dx
         mov ax, LBA
         div WORD [NumHeads]
         mov [Cylinder], al
         mov [Head], dl

         call _dump


er macht nur müll, hier ein bochs ausschnitt:
Zitat
Cylinder : 01
Head ... : 00000000
Sektor . : 10001000

OSLDR fehlt
Neustart mit beliebiger Taste


das gibt er mir bei LBA = 0x0000 aus.
DENKT DARAN DASS DIE BINÄRZAHLEN SPIEGELBILDLICH SIND:
11000001 <=> 10000011
9
ahh ok ich gebe mich geschlagen.
habs in der nasm-doc verplant.
thx

d.h. ich muss
xor ax, ax
mov bx, LBA ; OHNE [] da adr
div [SPT]
mov [Sector], dx


hab ich das richtig verstanden?
10
mach ich das nicht genau so?
nur in einer anderen reihenfolge?

ich blicke bei dir nicht so recht durch:
wieso ist DX:AX der LBA wert? für div muss er doch in (E)AX stehen?????

aber danke.
12
hallo leute,
ich habe ein problem beim berechnen von LBA -> CHS.
die rechnung funktioniert nur bei bestimmten werden für LBA. wenn ich in einer Schleife von 0x0B3F (2879) runterzähle, und einzeln alle CHS's berechnen will, bleibt BOCHS einfach stehen. und wenn ich den rechner damit boote auch, nur mit dem unterschied, dass er auch keine text schreibt, nur die werte in den variablen.

weiß einer von euch woran das liegen könnte?

danke im voraus
Uni_Sol

hier der quelltext zum berechnen:
CODE_SECTION:

; Interrups verbieten
         cli

; Stack setzen
         mov ax, 0x9000
         mov ss, ax
         xor sp, sp

;Kernel suchen und laden
        ;xor ax, ax ; diskreset
         ;xor dx, dx
         ;int 13h

         mov cx, 0x0B3F
         main_loop:
         mov ax, cx
         xor dx, dx ; CHS berechnen
         mov bx, 0x24
         div bx
         mov [Cylinder], dl

         mov ax, dx
         mov bx, 0x12
         xor dx, dx
         div bx
         mov [Head], dl

         mov ax, dx
         inc al
         mov [Sector], al

         call _dump

         xor ax, ax
         int 16h
         loop main_loop

push MsgBootError
         call _print
         inc sp
         inc sp

         ; Reboot nach tastendruck
xor ax, ax
         int 0x16
         db 0xEA
         dw 0x0000
         dw 0xFFFF


hier der dump:
_dump:
          pusha

                 push Cyl
                 call _print
                 inc sp
                 inc sp
          mov ax, [Cylinder]
                 mov cx, 0x08
                 mov bx, 0x02
                 lp1:
                 div bx
                 push ax
                 mov al, dl
                 add ax, 0x0E30
                 int 10h
                 pop ax
                 loop lp1
                 mov ax, 0x0E0D
                 int 10h
                 mov ax, 0x0E0A
                 int 10h

push Hea
                 call _print
                 inc sp
                 inc sp
mov ax, [Head]
                 mov cx, 0x08
                 lp2:
                 div bx
                 push ax
                 mov ax, dx
                 add ax, 0x0E30
                 int 10h
                 pop ax
                 loop lp2
mov ax, 0x0E0D
                 int 10h
                 mov ax, 0x0E0A
                 int 10h

push Sec
                 call _print
                 inc sp
                 inc sp
mov ax, [Sector]
                 mov cx, 0x08
                 lp3:
                 div bx
                 push ax
                 mov ax, dx
                 add ax, 0x0E30
                 int 10h
                 pop ax
                 loop lp3

                 mov cx, 2
                 lp4:
mov ax, 0x0E0D
                 int 10h
                 mov ax, 0x0E0A
                 int 10h
                 loop lp4

                 popa
          ret


print:
_print:
          push bp
                 mov bp, sp
                 pusha

                 mov si, [Param0]
                 mov ah, 0x0E
                 xor bx, bx
                 __print_1:
                  lodsb
                         or al, al
                           jz __print_2
                         int 10h
                         jmp __print_1
                 __print_2
popa
                         mov sp, bp
                 pop bp
          ret


hier noch die variablen:
DATA_SECTION:
Cylinder db 0x00
         Head db 0x00
         Sector db 0x00
13
Lowlevel-Coding / Register dump?
« am: 28. May 2006, 19:21 »
kuhl und wie?
14
Lowlevel-Coding / Register dump?
« am: 28. May 2006, 18:45 »
hi leute,
ich bin dabei eine funktion zum laden von sektoren zu schreiben.
nur will ich jetzt ein register dump machen um zu wissen ob er auch die
richtigen werte übergeben kriegt, denn die rechnung vom lba -> chs
stimmen, sind mathematisch/logisch korreckt.

weis einer wie das geht? ohne immer bei jedem dump das register von
hand von bin nach dec/hex um zu rechnen? das passt dann alles nicht
mehr in den bootsektor.

danke im voraus
Uni_Sol
15
Lowlevel-Coding / TeeJays Bootloader geht nicht.
« am: 27. May 2006, 00:21 »
Hi Leute,
ich habe den Bootloader von TeeJays Tut abgetippt und direkt seine .asm Datei genommen, assembled und mit Rawwrite auf eine FDD gemacht.

egal ob ich eine Kernel-Datei auf die FDD kopiere oder nicht, es geht nicht.
Er macht auch keine Debug-Meldung, die ich eingefügt habe, nach dem ich den Stack auf gesetzt habe. Er bootet nur neu.

Kann mir da einer von euche helfen?
mfg
Uni_Sol


ps hier der code, aber den kenn ja sicher schon alle:

; ### MACRO SECTION ###############################################################################################

%define Param1 bp+4
%define Param2 bp+6
%define Param3 bp+8
%define Param4 bp+10
%define Param5 bp+12

%define Var1 bp-2
%define Var2 bp-4
%define Var3 bp-6
%define Var4 bp-8
%define Var5 bp-10


; ### MACRO SECTION END ###########################################################################################


; ### ORIGIN SECTION ##############################################################################################

ORG 0x7C00

; ### ORIGIN SECTION END ##########################################################################################


; ### FATINFOBLOCK JUMP SECTION ###################################################################################

JUMP:
jmp CODE_SECTION

; ### FATINFOBLOCK JUMP SECTION END ###############################################################################


; ### FATINFOBLOCK SECTION ########################################################################################

FAT_TABLE_0:
OSName db "MSDOS5.0"
         BytesPerSec dw 0x0200
         SecPerClus db 0x01
         ResvdSecCnt dw 0x0001
         NumFATs db 0x02
         RootEntCnt dw 0x00E0
         TotSec dw 0x0B40
         MediType db 0xF0
         FATSize dw 0x0009
         SecPerTrack dw 0x0012
         NumHeads dw 0x0002
         HiddenSec dd 0x00000000
         TotSec32 dd 0x00000000
         DrvNum db 0x00
         CurrentHead db 0x00
         BootSig db 0x29
         VolumeID dd 0xFFFFFFFF
         VolumeLabel db "           "
         FileSystype db "FAT12   "

; ### FATINFOBLOCK SECTION END ####################################################################################


; ### CODE SECTION ################################################################################################

CODE_SECTION:

; Stack setzen
         cli
         mov ax, 0x9000
         mov ss, ax
         xor sp, sp
         sti

; Anfang Zeigen
push WORD MsgStart
         call _PrintString
         inc sp
         inc sp

; Kernel suchen sonst medlung machen
         call _FindFileSector
         or ax, ax
         jz KernelNotFound

; FAT Tabelle in den Speicher laden
call _ReadFATTable

; Segmente festelegen in die der Kernel geladen werden soll und in Temp speichern
mov ax, 1000
         mov dx, [RootEntCnt]
         shl dx, 5
         dec dx
         shr dx, 9
         add [Temp], dx

LoadKernelFile:
          mov dx, [Temp]
                 add dx, ax
                 dec dx ; (?) sub dx, 2
                 dec dx
                 push bx
                 push dx
                 call _ReadSector
                 add sp, 4
; FATEintrag lesen
                 push ax
                 call _ReadFATEntry
                 add sp, 2

; Erfolgreich
                 cmp ax, 0xFFF
                 je ExecuteKernel
                 add bx, 0x20
                 jmp LoadKernelFile

ExecuteKernel:
          mov ax, 1000
                 push ax
                 mov ax, 0
                 push ax
          retf

         KernelNotFound:
          push WORD MsgFileNotFound
                 call _PrintString
                 add sp, 2

         WaitForKeyToReboot:
          mov ah, 0
                 int 0x16

         Reboot:
          db 0xEA
                 dw 0x0000
                 dw 0xFFFF

; ### CODE SECTION END ############################################################################################


; ### FUNCTIONS SECTION ###########################################################################################

FUNCTIONS_SECTION:
; --- _PutString -----------------------------------------------------------------------------------------
_PrintString:
          push bp
                 mov bp, sp

                 pusha

                 mov si, [Param1]
                 mov ah, 0x0E
                 mov bx, 0x0007
                 _PrintString_1:
                  lodsb
                         or al, al
                         jz _PrintString_2
                         int 10h
                         jmp _PrintString_1
                 _PrintString_2
                  popa

                         mov sp, bp
                         pop bp
          ret
; --- _PutString END -------------------------------------------------------------------------------------


         ; --- _FindFileSector ------------------------------------------------------------------------------------
         _FindFileSector:
          push bp
                 mov bp, sp
                 dec sp ; (?) sub sp, 2
                 dec sp

                 pusha

                 mov ax, 0x9200
                 mov es, ax

                 mov ax, [FATSize]
                 mov bl, [NumFATs]
                 mul bl
                 add ax, [ResvdSecCnt]
                 mov [Temp], ax

                 xor dx, dx

                 _FindFileSector_E:
                  cmp dx, [RootEntCnt]
                         je _FindFileSector_A

                         test dx, 15
                         jnz _FindFileSector_B

                         push es
                         push ax
                         call _ReadSector
                         add sp, 4
                         inc ax
                         xor bx, bx

                 _FindFileSector_B:
                  cmp BYTE [es:bx], 0x0E
                         je _FindFileSector_D
                         cmp BYTE [es:bx], 0
                         je _FindFileSector_A

                         mov si, FileName
                         mov di, bx
                         mov cx, 11
                         repe cmpsb
                         or cx, cx
                         jz _FindFileSector_C

                 _FindFileSector_D:
                  inc dx
                         add bx, 32
                         jmp _FindFileSector_E

                 _FindFileSector_A:
                  popa
                         xor ax, ax
                         jmp _FindFileSector_Ende

                 _FindFileSector_C:
                  push WORD [es:bx+26]
                         pop WORD [Var1]
                         popa
                         mov ax, [Var1]
                 _FindFileSector_Ende:
                  mov sp, bp
                         pop bp
                         ret
         ; --- _FindFileSector END --------------------------------------------------------------------------------


         ; --- _ReadSector ----------------------------------------------------------------------------------------
         _ReadSector:
          push bp
                 sub sp, 6

                 pusha

                 mov ax, [Param1]
                 mov bx, 36
                 xor dx, dx ; (?) mov dx, 0
                 div bx
                 mov [Var1], ax

                 mov ax, dx
                 push ax
                 mov bx, 18
                 xor dx, dx ; (?) mov dx, 0
                 div bx
                 mov ax, dx
                 inc ax
                 mov [Var3], ax

                 _ReadSector_1:
                  mov ax, [Param2]
                         mov es, ax
                         xor bx, bx ; (?) mov dx, 0
                         mov ah, 2
                         mov al, 1
                         mov ch, [Var1]
                         mov cl, [Var3]
                         mov dh, [Var2]
                         xor dl, dl ; (?) mov dl, 0
                         int 13h
                         jc _ReadSector_1

                 popa
                 mov sp, bp
                 pop bp
                 ret
         ; --- _ReadSector END ------------------------------------------------------------------------------------


         ; --- _ReadFATEntry --------------------------------------------------------------------------------------
         _ReadFATEntry:
          push bp
                 mov bp, sp
                 dec sp ; (?) sub sp, 2
                 dec sp

                 pusha

                 mov ax, [Param1]
                 mov bx, 3
                 mul bx
                 dec bx ; (?) mov bx, 3
                 xor dx, dx
                 div bx

                 mov bx, 0x9200
                 mov es, bx
                 mov bx, ax
                 mov ax, [es:bx]
                 mov [Var1], ax

                 mov cx, [Param1]
                 test cx, 1
                 jz _ReadFATEntry_Gerade

                 popa
                 mov ax, [Var1]
                 shr ax, 4
                 jmp _ReadFATEntry_Ende

                 _ReadFATEntry_Gerade:
                  popa
                         mov ax, [Var1]
                         and ax, 0xFFF

                 _ReadFATEntry_Ende:
                  mov sp, bp
                         pop bp
                         ret
         ; --- _ReadFATEntry END ----------------------------------------------------------------------------------


         ; --- _ReadFATTable --------------------------------------------------------------------------------------
         _ReadFATTable:
          pusha

                 mov bx, 0x9200
                 mov ax, [ResvdSecCnt]
                 mov cx, [FATSize]

                 _ReadFATTable_A:
                  push bx
                         push ax
                         call _ReadSector
                         add sp, 4
                         inc ax
                         add bx, 32
                         loop _ReadFATTable_A

                 popa

                 ret

         ; --- _ReadTATTable END ----------------------------------------------------------------------------------


; ### FUNCTIONS SECTION END #######################################################################################


; ### PLACEHOLDER SECTION #########################################################################################

PLACEHOLDER_SECTION:
times 465-($-$$) db 0

; ### PLACEHOLDER SECTION END #####################################################################################


; ### DATA SECTION ################################################################################################

DATA_SECTION:
MsgStart db "Loading kernel: ", 0
MsgFileNotFound db "File not found", 0
         FileName db "kernel16sys"
         Temp dw 0

; ### DATA SECTION END ############################################################################################


; ### BOOTSTRAP SECTION ###########################################################################################

BOOTSTRAP_SECTION:
dw 0AA55h

; ### BOOTSTRAP SECTION END #######################################################################################


und hier der kernel:
; ### MACRO SECTION ###############################################################################################

%define Param1 bp+4
%define Param2 bp+6
%define Param3 bp+8
%define Param4 bp+10
%define Param5 bp+12

%define Var1 bp-2
%define Var2 bp-4
%define Var3 bp-6
%define Var4 bp-8
%define Var5 bp-10


; ### MACRO SECTION END ###########################################################################################


; ### ORIGIN SECTION ##############################################################################################

ORG 0x1000

; ### ORIGIN SECTION END ##########################################################################################


; ### CODE SECTION ################################################################################################

START:
push WORD MsgStart
         call _PrintString
         inc sp
         inc sp

crash:
jmp crash

; ### CODE SECTION END ############################################################################################


; ### FUNCTIONS SECTION ###########################################################################################

FUNCTIONS:
; --- _PutString -----------------------------------------------------------------------------------------
_PrintString:
          push bp
                 mov bp, sp

                 pusha

                 mov si, [Param1]
                 mov ah, 0x0E
                 mov bx, 0x0007
                 _PrintString_1:
                  lodsb
                         or al, al
                         jz _PrintString_2
                         int 10h
                         jmp _PrintString_1
                 _PrintString_2
                  popa

                         mov sp, bp
                         pop bp
          ret
; --- _PutString END -------------------------------------------------------------------------------------


; ### FUNCTIONS SECTION END #######################################################################################


; ### DATA SECTION ################################################################################################

DATA:
MsgStart db "Done.", 13, 10, 0
         Temp dw 0

; ### DATA SECTION END ############################################################################################


Nicht erschrecken, die Comments mit # sind zu lang für eine Zeile, das sind nicht 2 in der richtigen asm-Datei ;P
16
Lowlevel-Coding / bootloader geht nicht...
« am: 06. April 2006, 17:24 »
@darkthing:
 danke - ist wohl auch klar ;) denkfehler

@porkchicken:
 wir sind gerade dabei den pmode zu lernen. das haben wir alles aus dem
 tee-jay tutorial. das ist sogar teilweise der quelltext von ihm.
 also: no se.
17
Lowlevel-Coding / bootloader geht nicht...
« am: 06. April 2006, 16:44 »
hi,
ich habe mit nem kumpel nen bootloader geschrieben. nun wollen wir den pmode starten. aber der rechner bootet einfach neu. hier ist einfach mal der quelltext. vom bootloader und dem kernel.
weiß einer von euch woran das lienge könnte?

bootloader:[ORG 0x7C00] ; startadresse für den Bootloader. Vom Bios vorgeschrieben

jmp start

NULL_Desc:
dd 0
dd 0

CODE_Desc:
dw 0xFFFF
dw 0
db 0
db 0x9A
db 0xCF
db 0

DATA_Desc:
dw 0xFFFF
dw 0
db 0
db 0
db 0x92
db 0xCF
db 0

gdt:
Limit dw 0
Base dd 0

start:
; stack generieren
cli                                     ; Verbiete Interrupts

mov ax, 0x9000
mov ss, ax                              ; SS = 9000 (unser Stack)
mov sp, 0                               ; SP = 0000 (Stackpointer) [Anfang vom Stack]

mov eax, cs
mov es, ax
shl eax, 4

sti

mov si, pmode
call putstring

mov [CODE_Desc+2], ax
mov [DATA_Desc+2], ax

shr eax, 4
mov [CODE_Desc+4], al
mov [DATA_Desc+4], al

mov eax, cs
shl eax, 4
add eax, NULL_Desc
mov [Base], eax
mov [Limit], WORD gdt - NULL_Desc - 1
lgdt [gdt]

mov eax, cr0
or eax, 1
mov cr0, eax

db 0xea
dw PMODE
dw 0x8

[BITS 32]

PMODE:
mov WORD [CODE_Desc+2], 0
mov WORD [DATA_Desc+2], 0
mov BYTE [CODE_Desc+4], 0
mov BYTE [DATA_Desc+4], 0

mov eax, 2
shl eax, 3

mov ds, ax
mov ss, ax
mov es, ax
mov eax, 0
mov fs, ax
mov gs, ax
mov esp, 0x1FFFFF

jmp 0x8:0x10000 + PMODE2

PMODE2:
mov si, done
call putstring
jmp LOAD_KERNEL

LOAD_KERNEL:

; Bootlaufwerk aus DL speichern
mov [bootdrv], dl

; kernel laden
call load

; zu kernel springen
mov ax, 0x1000                        ; Die startadresse vom Programm
mov es, ax                            ; Segmentregister updaten
mov ds, ax
push ax                               ; in den stack
mov ax, 0
push ax                               ; in den stack

retf


bootdrv db 0
msg db "Loading Kernel          ", 0
pmode db "Setting up PMode        ", 0
done db "[Done]", 13, 10, 0

load:
  ; Laufwerk an den start zurück setzen (INT 13h, 0)
mov si, msg
call putstring

push ds                                ; DS in den Stack
mov ax, 0
mov dl, [bootdrv]                      ; ermitteltes Bootlaufwerk benutzen
int 13h
pop ds                                 ; DS wieder herstelln aus dem Stack
jc load                                ; wenn fehler retry

load_sub:
mov ax, 0x1000                       ; ES:BX = 0x1000
       mov es, ax
       mov bx, 0
       ; sektoren lesen (INT 13h, 2)
       mov ah, 2                            ; Funktion 2 -> Lesen
       mov al, 5                            ; 5 Sektoren lesen
       mov cx, 2                            ; Cylinder 0, Sektor 2
       mov dx, 0                            ; Head 0, Laufwerk 0
       int 13h                              ; Daten vom Laufwerklesen
       jc load_sub                          ; wenn fehler retry

         mov si, done
         call putstring
retn

putstring:
lodsb                                  ; Singlebyte lesen
or al, al
jz short putstring_end                 ; 0-Byte (CHR(0)) dann stringende

mov ah, 0x0E                           ; Funktion 0E
mov bx, 0x0007                         ; Attribute-Byte (wird nicht benötigt)
int 10h                                ; BIOS-Programm 10 aufrufen (Bildschirmausgabe)
jmp putstring                          ; nächstes Byte
putstring_end:
retn

times 512-($-$$)-2 db 0 ; Dateilänge: 512 Bytes
dw 0xAA55 ; Bootsignatur


kernel:[BITS 32]

mov si, text
call putstr

_LOOP:
jmp _LOOP

putstr:
lodsb
or al,al
jz short putstrd
mov ah,0x0E
mov bx,0x0007
int 0x10
jmp putstr
putstrd:
retn

text db "> Now operating in 32 bit PMode.", 13 ,10, "> If you can see this, it's done.", 13, 10, 0
18
Lowlevel-Coding / Speicher Management
« am: 30. March 2006, 21:22 »
wozu??? entweder mache ich es selber oder nicht. und wir wollen alles selber machen

ja was der pm ist weis ich auch-nur nicht wie man ihn nutzt
19
Lowlevel-Coding / Speicher Management
« am: 30. March 2006, 18:48 »
Hi leute,
ich bin jetzt mit ein par Kumpels dran auch ein (weiteres) OS zu coden.

Was ich bis jetzt noch aus keinem Tutorial verstanden hab ist, was es mit dem Sprung in den PM auf sich hat und wie man einen C Kernel einbindet. Mein DJGPP macht irgendwie keine reinen Binärdaten.
Gut das hätte noch zeit. man kann ja erst die Funktionen schreiben und dann alles einbinden.

Worum es mir jetz in erster Linie geht ist das Thema Speichermangement. Wie würdet ihr einen Speichermanager schreiben? Und, was man dazu noch braucht: Wie finde ich die RAM-Größe raus? Er muss ja schließlich wissen wieviel Speicher er verwalten muss/darf.

Danke im Voraus
Uni_Sol
Seiten: [1]

Einloggen