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.


Themen - Another Stupid Coder

Seiten: [1] 2
1
Offtopic / OOP mit Ansi-C
« am: 28. January 2006, 17:14 »
Hallo,
Bevor jetzt die Fragen wie "warum nicht C++?" aufkommen, möchte ich bemerken, dass ich aus verschiedenen Gründen kein C++ mag und die anderen Personen, die an dem Projekt arbeiten kein Obj-C können.

Also, ich habe das Problem, dass ich momentan eine Funktion "überladen" müsste. Der Ausgangspunkt ist folgender:
Es gibt ein Objekt "game_object". Die Daten von diesem werden als "strukt" gespeichert. Nun gibt es auch eine Funktion "game_object_draw", welche die meisten "game_object"-Objekte zeichnen soll. Nur MANCHE brauchen eine eigene draw-Funktion. Und hier fängt das Problem an: Wie mache ich das?
Eine Möglichkeit währe es natürlich, die Funktionen einfach in Funktionszeigern innerhalb der Struktur zu lagern, aber da fehlt dann natürlich ein "this" damit ich auch wirklich auf die Daten dieses Objekts zugreifen kann.
Was vielleicht noch wichtig ist: Die Strukturen kommen dann in eine verkettete Liste und deshalb müssen die Funktionen per Zeiger auf die Liste abrufbar sein.

Weiß also jemand wie ich ein "this" in C implementieren kann?
2
Lowlevel-Coding / IDT Prob...(asm)
« am: 16. June 2005, 22:13 »
Hallo,
Ich arbeite mit fasm und hab mal versucht auch damit ne IDT aufzustellen das hat damals nicht so ganz funktioniert, da hab ich's aufgegeben, heute habe ich den Code wieder rausgekramt und etwas herumprobiert, aber erfolglos, daher wollte ich mal hier fragen. Der Code sieht so aus:

macro IdtEntry Isr
{
dw Isr and 0xffff
dw 0x0008
db 00000000b
db 10001110b
dw Isr shr 16
}

macro Exception Message
{
pusha
push gs
push fs
push ds
push es

mov esi, Message
call PutString
cli
hlt

pop es
pop ds
pop fs
pop gs
popa
iret
}

InterruptDescriptorTable:
dw EndOfIdtEntries - IdtEntries -1
dd IdtEntries

IdtEntries:
IdtEntry Isr1
[...]
IdtEntry Isr33
EndOfIdtEntries:

Isr0: Exception Msg_Exception_1
[...]
Isr31: Exception Msg_Exception_32
Isr32:
pusha
push gs
push fs
push ds
push es

push String_Header
push 0x1f
call PutString

pop es
pop ds
pop fs
pop gs
popa
iret
Isr33:
pusha
push gs
push fs
push ds
push es

;xor eax, eax
;in al, 0x60
;call PutChar
push String_Header
call PutString
;mov al, 0x20
;out 0xA0, al
;out 0x20, al

pop es
pop ds
pop fs
pop gs
popa
iret


die IDT wird so geladen:

lidt [InterruptDescriptorTable]
sti

Nun beschwert sich Bochs aber, dass diese IDT ungültig ist, hat da jemand ne Idee?
3
Offtopic / ziemlich gutes GNU Assembly Buch
« am: 14. June 2005, 15:52 »
Hallo,
Da hier ja immer wieder nach Assembly-Büchern gefragt wird, möchte ich eines vorstellen, welches ich vor kurzem "gefunden" habe und ziemlich gut finde. Es beschreibt zwar die Assemblyprogrammierung mit GAS unter GNU/Linux aber man lernt sicher auch allgemein Assembly dabei.

Ist auf Englisch und hier erhältlich.
4
Lowlevel-Coding / NASM Preprozessor
« am: 24. May 2005, 18:19 »
Hallo :)
Ich habe da ein kleines Problem, bei diesem Code:

dw ( Isr0 & 0xffff )
dw 0x0008
db 00000000b
db 10001110b
dw ( Isr0 >> 16 )

sagt Nasm immer:

Idt.asm:8: error: `&' operator may only be applied to scalar values
Idt.asm:12: error: shift operator may only be applied to scalar values

Kennt sich da jemand aus? Also weiß jemand, was der Fehler ist? Wenn ich das ganze als Makro machen will, kommt der gleiche Fehler.
5
Lowlevel-Coding / Problem mit lodsb/esi/...
« am: 16. May 2005, 11:39 »
Bei folgendem Code funktioniert lodsb irgendwie nicht...
Wie man sieht ist nach dem lodsb ein cli/hlt eingebaut, Bochs sagt mir bei das eax an dieser Stelle 0x00000000 ist, wenn ich "si" statt "esi" verwende (ich hab schon viel herum-probiert) kommt 0x000000ff in eax...

mov esi, Msg_Welcome
call PutString

jmp $
; =================[ End ]===============================
cli ; disable interrupts.
hlt ; halt the cpu.
; =================[ Misc Data ]=========================
CursorPosition dd 0x00000000
Msg_Welcome db "Welcome", 0

PutString:
mov edx, [CursorPosition]
mov ax, 0x0018
mov es, ax
.1:
lodsb
cli
hlt
or al, al
jz short .2
mov byte [es:edx], al
inc dx
mov byte [es:edx], 0x07
inc dx
jmp .1
.2:
mov [CursorPosition], dx
mov ax, 0x0010
mov es, ax
retn
6
Lowlevel-Coding / C-Kernel und globale Variablen...
« am: 23. April 2005, 10:41 »
Hallo :)
Ich hab jetzt mal wieder nen C-Kernel und damit auch gleich ein Problem. Wenn ich Variablen Global deklariere und ihnen gleich einen Wert zuweise, so funktioniert das nicht, aber wenn ich sie global deklariere und ihnen den Wert erst in der Main-Funktion gebe, funktioniert es, Beispiel:

int Bla = 1;

void Main()
{
// Bla ist trotzdem 0.
}


int Bla;

void Main()
{
// Bla ist 1.
}

Tja, gibts da irgendwelche speziellen Register die GCC benutzt, oder macht er was spezielles am Stack oder halt IRGENDWAS, was ich beachten sollte? Wäre sehr nett, wenn jemand was wüsste :)
Hier noch der Code vom Kernelstarter:

;      _/    _/  _/_/_/_/  _/        _/  _/_/_/_/  _/_/_/_/
;     _/    _/  _/        _/        _/  _/    _/  _/
;    _/    _/  _/        _/        _/  _/    _/  _/
;   _/_/_/_/  _/_/_/    _/        _/  _/    _/  _/_/_/_/
;  _/    _/  _/        _/        _/  _/    _/        _/
; _/    _/  _/_/_/_/  _/_/_/_/  _/  _/_/_/_/  _/_/_/_/
; =======================================================
; = (C) 2005 by Paul Anselm Haerle =
; = Mail: paulhaerle@gmx.at =
; = ICQ: 214604864 =
; =======================================================
[bits 32] ; yeah, the power of 32bit ;).
[extern Main]
[global start]
[global LinearFrameBuffer]
start:
mov ax, 0x0010 ; move the code selector to ax.
mov ds, ax ; move the cs to ds.
mov es, ax ; move the cs to es.
mov fs, ax ; move the cs to fs.
mov gs, ax ; move the cs to gs.
mov ss, ax ; move the cs to ss.
mov esp, 0x9FFFF ; set the stackpointer to 0x9FFFF

mov edi, [0x30000+40]
mov dword [LinearFrameBuffer], edi ; lfbadress was stored in edi during our time in rm.
; -------------------------------------------------------
; - This turns off the floppymotor. -
; -------------------------------------------------------
mov dx, 0x3F2 ; floppydrive port.
mov al, 0x0C ; command "stop the motor.".
out dx, al ; send this command.
; =======================================================
; = The C-Kernel. =
; =======================================================
call Main

cli
hlt
; =======================================================
; = Data. =
; =======================================================
LinearFrameBuffer dd 0

(Im Bootloader wird in den Pmode geschalten und dann eben in diesen Kernelstarter fargejumpt...
7
Lowlevel-Coding / Vesa@0x30000
« am: 16. April 2005, 20:14 »
Hallo,
hab jetzt mal die Vesa-Infos nach 0x30000 geladen (die aufteilung wie die meisten: Kernel 0x10000 = kernel,...) nur hab ich ein kleines Prob:

typedef struct VesaModeInfoBlock
{
unsigned int VbeModeModeAttributes;
unsigned char VbeModeWinAAttributes;
unsigned char VbeModeWinBAttributes;
unsigned int VbeModeWinGranularity;
unsigned int VbeModeWinSize;
unsigned int VbeModeWinASegment;
unsigned int VbeModeWinBSegment;
unsigned long VbeModeWinFuncPtr;
unsigned int VbeModeBytesPerScanLine;
unsigned int VbeModeXResolution;
unsigned int VbeModeYResolution;
unsigned char VbeModeXCharSize;
unsigned char VbeModeYCharSize;
unsigned char VbeModeNumberOfPlanes;
unsigned char VbeModeBitsPerPixel;
unsigned char VbeModeNumberOfBanks;
unsigned char VbeModeMemoryModel;
unsigned char VbeModeBankSize;
unsigned char VbeModeNumberOfImagePages;
unsigned char VbeModeReserved_page;
unsigned char VbeModeRedMaskSize;
unsigned char VbeModeRedMaskPos;
unsigned char VbeModeGreenMaskSize;
unsigned char VbeModeGreenMaskPos;
unsigned char VbeModeBlueMaskSize;
unsigned char VbeModeBlueMaskPos;
unsigned char VbeModeReservedMaskSize;
unsigned char VbeModeReservedMaskPos;
unsigned char VbeModeDirectColorModeInfo;
unsigned long VbeModePhysBasePtr;
unsigned long VbeModeOffScreenMemOffset;
unsigned int VbeModeOffScreenMemSize;
unsigned int VbeModeLinBytesPerScanLine;
unsigned char VbeModeBnkNumberOfPages;
unsigned char VbeModeLinNumberOfPages;
unsigned char VbeModeLinRedMaskSize;
unsigned char VbeModeLinRedFieldPos;
unsigned char VbeModeLinGreenMaskSize;
unsigned char VbeModeLinGreenFieldPos;
unsigned char VbeModeLinBlueMaskSize;
unsigned char VbeModeLinBlueFieldPos;
unsigned char VbeModeLinRsvdMaskSize;
unsigned char VbeModeLinRsvdFieldPos;
unsigned long VbeModeMaxPixelClock;
unsigned long VbeModeReserved[ 190 ];
}VesaModeInfoBlock;

void InitVideo()
{
VesaModeInfoBlock *VbeModeInfoBlock = ( VesaModeInfoBlock * ) 0x30000;
unsigned char *VideoMemory = ( unsigned char * ) VbeModeInfoBlock->VbeModePhysBasePtr;

int i;
for( i = 0; i < 3000; i ++)
{
VideoMemory[ i ] = 0xff;
}
}

Das sollte doch funzen und einen teil des Bildschirms (fast eine Zeile) weiß einfärben oder? (1024x768x24) hat da jemand nen tipp? (es bleibt halt einfach schwarz)
8
Lowlevel-Coding / PutPixel (24Bit)
« am: 15. April 2005, 22:24 »
Okay, wieder mal ne Frage:
Wenn ich folgenden Code verwende um ein Pixel zu zeichnen:

PutPixel:
pusha
mov edi, [LinearFrameBuffer]
mov eax, 3072
mov ebx, ecx
mul ebx
add edi, eax
add edi, edx
mov ecx, 1024
mov eax, 0xffffff
stosd
popa
ret

funzt die x-Koordinatio (edx) irgendwie nicht und irgendwie kommt bei mir sonst nur scheiße raus, sollte doch eigentlich GANZ leicht sein, bin auch schon etwas müde (;D) hat jemand nen tipp?
9
Lowlevel-Coding / Problem mit GCC Inline Assembly
« am: 22. March 2005, 13:57 »
Hallo :)
Ich bin soeben dabei, mal meine Exceptions zu schreiben und da ich nicht extra ein Asm-Modul dazulinken will wollte ich dies ganz in Inline-ASM machen, so:

asm volatile
(
"pusha \n"
"push %%gs \n"
"push %%fs \n"
"push %%ds \n"
"push es"
);

/* Isr-Code. */

asm volatile
(
"pop %%es \n"
"pop %%ds \n"
"pop %%fs \n"
"pop %%gs \n"
"popa"
);
}

Tja, doch wenn ich das Compillieren will, sagt gcc:

/tmp/ccPfBEsA.s:619: Error: bad register name `%%gs'

(logischerweise für jedes Auftregen eines registernamens, nicht nur für "gs".)
Doch soweit ich weiß, ist das die korrekte Schreibweise für GCC-Inline-Asm oder etwa nicht?

Vielen Dank für die Antworten im vorraus :)
10
Das Wiki / VESA-Tutorial (noch sehr primitiv)
« am: 08. February 2005, 20:30 »
Hallo, ich wollte nur mal eine 1. Version meines VESA-Tutorials präsentieren, welches natürlich noch ausgebaut wird, ich wollte nur mal fragen wir ihr es so findet und was ich noch ändern sollte :)
URL: http://www.8ung.at/paulhaerle/Vesa.doc
Ich habe es einmal nach "Das Magazin" gepostet, da ich denke, dass es eine Form von Docu ist und insofern auch was mit dem Magazin zu tun hat :)
11
Lowlevel-Coding / PMODE geht nimmer wenn VESA aktiviert ist.
« am: 26. January 2005, 17:27 »
Also, ich habe mal wieder (wie sooft) ein Problem: Der PMode funktioniert einwandfrei (noch immer BlueXSevens Code aus dem Pmode-Thread, wenn er was dagegen hat, soll er sich bitte per PM oder einfach hier melden :)) doch wenn ich in einen VBE-Modus (0x0100 + LFB = 0x4100) schalte, geht auch das, nur dann geht der Jump in den PMode nimmer.
Hier der Bochs-Error:

00000697755i[VGA  ] VBE enabling x 640, y 400, bpp 8, 256000 bytes visible
00000697856p[CPU  ] >>PANIC<< jump_protected: task gate.p == 0

und nun der Code:


[bits 16]

jmp Start

; ---------------------------------------
; - Global Descriptor Table. -
; ---------------------------------------
Descriptors dw 0x0000
dw 0x0000
db 0x00
db 0x00
db 0x00
db 0x00

dw 0xFFFF
dw 0x0000
db 0x00
db 0x9A
db 0xCF
db 0x00

dw 0xFFFF
dw 0x0000
db 0x00
db 0x92
db 0xCF
db 0x00

GDT dw 23
dd 0
; ---------------------------------------
; - VESA block. -
; ---------------------------------------
VbeSignature db "VBE2"
VbeVersion dw 0x0200
OemStringPtr dd 0x0
Capabilities dd 0x0
VideoModePtr dd 0x0
TotalMemory dw 0x0
OemSoftwareRev dw 0x0
OemVendorNamePtr dd 0x0
OemProductNamePtr dd 0x0
OemProductRevPtr dd 0x0
Reserved times 222 db 0x0
OemData times 256 db 0x0
SixtyFourBytes times 64 db 0x0
; ---------------------------------------
; - ModeInfo block. -
; ---------------------------------------
ModeAttributes dw 0x0
WinAAttributes db 0x0
WinBAttributes db 0x0
WinGranularity dw 0x0
WinSize dw 0x0
WinASegment dw 0x0
WinBSegment dw 0x0
WinFuncPtr dd 0x0
BytesPerScanLine dw 0x0
XResolution dw 0x0
YResolution dw 0x0
XCharSize db 0x0
YCharSize db 0x0
NumberOfPlanes db 0x0
BitsPerPixel db 0x0
NumberOfBanks db 0x0
MemoryModel db 0x0
BankSize db 0x0
NumberOfImagePages db 0x0
Reserved2 db 0x0
RedMaskSize db 0x0
RedFieldPosition db 0x0
GreenMaskSize db 0x0
GreenFieldPosition db 0x0
BlueMaskSize db 0x0
BlueFieldPosition db 0x0
RsvdMaskSize db 0x0
RsvdFieldPosition db 0x0
DirectColorModeInfo db 0x0
PhysBasePtr dd 0x0
Reserved3 dw 0x0, 0x0, 0x0
LinBytesPerScanLine dw 0x0
BnkNumberOfImagePages db 0x0
LinRedMaskSize db 0x0
LinRedFieldPosition db 0x0
LinGreenMaskSize db 0x0
LinGreenFieldPosition db 0x0
LinBlueMaskSize db 0x0
LinBlueFieldPosition db 0x0
LinRsvdMaskSize db 0x0
LinRsvdFieldPosition db 0x0
MaxPixelClock dd 0x0
Reserved4 times 189 db 0x0

Start:

; ---------------------------------------
; - VBE. -
; ---------------------------------------

mov ax, VbeSignature
stosw
mov ax, 0x4F00
int 0x10
cmp al, 0x004F
je .1
.1:
mov ax, SixtyFourBytes
stosw
mov ax, 0x4F02
mov bx, 0x4100 ; # of the Mode.
int 0x10


; ---------------------------------------
; - Protected Mode Start. -
; ---------------------------------------
mov ax, cs
mov ds, ax

cli

xor eax, eax
mov ax, ds
shl eax, 4
add eax, Descriptors
mov dword [GDT+2], eax

lgdt [GDT]

mov eax, cr0
or al, 00000001b
mov cr0, eax

jmp 0x0008:dword 0x10000+ProtectedMode

; =======================================
; = Here starts 32bit protected mode. =
; =======================================

[bits 32]


ProtectedMode:

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

mov edi, 0x000B8000
mov Byte [edi  ], 'L'
mov Byte [edi+2], 'O'
mov Byte [edi+4], 'W'

; ---------------------------------------
; - Functions and variables. -
; ---------------------------------------

Absolut nicht schön, aber ich wollte erstmal das es funktioniert bevor ich den Code schöner mache und ihn eventuell in ein Tut einbaue (daher sind auch ALLE Bytes "belabelt" (was für eine Tipp-Arbeit!).
12
Lowlevel-Coding / Sehr primitive Frage *schäm*
« am: 24. December 2004, 16:04 »
Ist mir ja sehr peinlich, aber wie schreibt man eine Adresse (eines Labels zum Beispiel) nach es:di ? die überlappen sich doch oder?
13
Lowlevel-Coding / C-Funktionen...
« am: 12. December 2004, 14:39 »
Hallo,
Mein neuestes Problem, bei dem ich wirklich nicht weiter weiß...neben globalen Variablen kann ich nun auch keine Funktionen benutzen...Es sollte am C-Kernel liegen, alles andere hatte ich schon zum testen ausprobiert...ich habe den Kernel 2 mal nur von C in Assembler übersetzen lassen, 1mal mit dem Code in der Main-Funktion (klappt) einmal mit dem Code in "void PutCharA()" (klappt nicht!) wäre nett wenn jemand wüsste was da los ist...
C-Code: (der funzt. Im 2. Asm-Code wurde dann alles nach "PutCharA();" aus der Main-Funktion in die PutCharA-Funktion kopiert.)

unsigned char *VGA;

void PutCharA();

void main()
{
VGA = (unsigned char *)0xA0000;
PutCharA();

unsigned int PositionOfTheChar = 1 * 80 * 10;

VGA[PositionOfTheChar] = 0x3C; // 00 11 11 00
VGA[PositionOfTheChar + 80] = 0x42; // 01 00 00 10
VGA[PositionOfTheChar + 160] = 0x81; // 10 00 00 01
VGA[PositionOfTheChar + 240] = 0xFF; // 11 11 11 11
VGA[PositionOfTheChar + 320] = 0x81; // 10 00 00 01
VGA[PositionOfTheChar + 400] = 0x81; // 10 00 00 01
VGA[PositionOfTheChar + 480] = 0x81; // 10 00 00 01
VGA[PositionOfTheChar + 560] = 0x81; // 10 00 00 01

};

void PutCharA()
{

};

1. Asm-Code (Wo alles in der Main-Funktion steht)

.file "Main.c"
.text
.globl PutCharA
.type PutCharA, @function
PutCharA:
pushl %ebp
movl %esp, %ebp
popl %ebp
ret
.size PutCharA, .-PutCharA
.globl main
.type main, @function
main:
pushl %ebp
movl $655360, VGA
movl %esp, %ebp
call PutCharA
movb $60, 656160
movb $66, 656240
movb $-127, 656320
movb $-1, 656400
movb $-127, 656480
movb $-127, 656560
movb $-127, 656640
movb $-127, 656720
popl %ebp
ret
.size main, .-main
.comm VGA,4,4
.section .note.GNU-stack,"",@progbits
.ident "GCC: (GNU) 3.3.3"

Und so sieht das ganze aus, wenn der Code in die PutCharA-Funktion ausgelagert wurde:

.file "Main.c"
.text
.globl PutCharA
.type PutCharA, @function
PutCharA:
movl VGA, %eax
pushl %ebp
movl %esp, %ebp
movb $60, 800(%eax)
movl VGA, %eax
movb $66, 880(%eax)
movl VGA, %eax
movb $-127, 960(%eax)
movl VGA, %eax
movb $-1, 1040(%eax)
movl VGA, %eax
movb $-127, 1120(%eax)
movl VGA, %eax
movb $-127, 1200(%eax)
movl VGA, %eax
movb $-127, 1280(%eax)
movl VGA, %eax
movb $-127, 1360(%eax)
popl %ebp
ret
.size PutCharA, .-PutCharA
.globl main
.type main, @function
main:
pushl %ebp
movl $655360, VGA
movl %esp, %ebp
popl %ebp
jmp PutCharA
.size main, .-main
.comm VGA,4,4
.section .note.GNU-stack,"",@progbits
.ident "GCC: (GNU) 3.3.3"


gcc --freestanding -Os -fno-builtin -c  -o Main.obj Main.c
ld --oformat "binary" -o Kernel.bin Start32.obj Main.obj

Also, falls jemand gerade Zeit hat :)
14
Lowlevel-Coding / VGA: Adresse des Pixels berechnen.
« am: 04. December 2004, 09:41 »
Hallo,
tut mir leid das ich wieder mal nerve, aber 's eben so. Folgendes Problem, da mir der 0x13er Mode zu pixelig war (320x200x256) habe ich nun in den 0x12er Modus geschalten (640x480x16). Soweit ich alles kapiert habe, ist hier nun so das nicht mehr jedes Pixel ein Byte ist (wie im 0x13er Mode) sondern nur noch je ein Bit und ein Byte also Acht Pixel darstellt, irgendwo habe ich auch gelesen das man dann die Plane wechseln muss um andere Farben zu bekommen. Aber das ist momentan egal, da ich erstmal die Pixel nur an der richtigen Stelle haben will (Farbe kommt später) Ich hatte (mit etwas Hilfe bei der Logik, da es schon zu spät zum denken war) folgendes gecodet:

unsigned char *VGA;

void PutPixel(unsigned int X, unsigned int Y)
{
unsigned int BitPosition = (Y * 640 + X) % 8; // Stelle des Bits im Byte.
unsigned int BytePosition = (Y * 640 + X) / 8; // Stelle des Bytes im Speicher.
unsigned char TheByte;
if(BitPosition == 0)
TheByte = 1; // 00 00 00 01b
else if(BitPosition == 1)
TheByte = 2; // 00 00 00 10b
else if(BitPosition == 2)
TheByte = 4; // 00 00 01 00b
else if(BitPosition == 3)
TheByte = 8; // 00 00 10 00b
else if(BitPosition == 4)
TheByte = 16; // 00 01 00 00b
else if(BitPosition == 5)
TheByte = 32; // 00 10 00 00b
else if(BitPosition == 6)
TheByte = 64; // 01 00 00 00b
else if(BitPosition == 7)
TheByte = 128; // 10 00 00 00b

VGA[BytePosition] = VGA[BytePosition] | TheByte;
};


int main()

{

VGA = (unsigned char *)0xA0000;


PutPixel(0, 0);
PutPixel(1, 1);
PutPixel(2, 2);
PutPixel(5, 10);



return(0);

}


Nun würde mich interessieren, ob vielleicht jemand einen Tipp hätte, was ich hier falsch gemacht habe.
Danke im vorraus :)
15
Lowlevel-Coding / Globale _Variablen_ im C-Kernel?
« am: 28. November 2004, 15:18 »
Hallo,
(nur mal im vorraus ich spreche nicht von Instanzen einer Klasse, sondern von normalen integer variablen.)
Folgendes Problem: Globale Variablen klappen ganz normal wenn ich sie global deklariere und dann in einer funktion initialisiere bsp:

int foo;

main()
{
    foo = 3;
};

Doch wenn ich ihnen gleich einen Wert zuweisen will, so funktioniert das nicht also:

foo = 3;

main()
{

}

klappt nicht...weiß jemand woran das liegen könnte? Muss man da zuerst irgendwas tun?
16
Lowlevel-Coding / Pmode?
« am: 14. November 2004, 23:54 »
Hallo,
Ich habe nun TeeJay's code kopiert (jaja, ich weiß, aber ich wollte mir halt mal den PMode in Asm ansehen ;)) und nun wollte ich ein Zeichen ausgeben, doch musste ich feststellen das es nicht funktioniert...mein (Test-) PC blinkt noch (also dieser "_") und rebootet nicht oder so...er gibt nur einfach kein Zeichen aus...kann mir da jemand helfen?


[BITS 16]

jmp Start

DescriptorNull:
dd 0
dd 0

DescriptorCode:
dw 0xFFFF
dw 0
db 0
db 0x9A
db 0xCF
db 0

DescriptorData:
dw 0xFFFF
dw 0
db 0
db 0x92
db 0xCF
db 0

GlobalDescriptorTable:
Limit dw 0
Base dd 0

Start:
cli
mov eax, cs
mov ds, ax

shl eax, 4
mov [DescriptorCode+2], ax
mov [DescriptorData+2], ax
shr eax, 16
mov [DescriptorCode+4], al
mov [DescriptorData+4], al

mov eax, cs
shl eax, 4
add eax, DescriptorNull
mov [Base], eax
mov [Limit],WORD GlobalDescriptorTable - DescriptorNull - 1

lgdt [GlobalDescriptorTable]

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

db 0xea ;Bitmuster für einen FAR JUMP
dw ProtectedMode
dw 0x8

[BITS 32]

ProtectedMode:

mov WORD [DescriptorCode+2], 0

mov WORD [DescriptorData+2], 0

mov BYTE [DescriptorCode+4], 0

mov BYTE [DescriptorData+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 + ProtectedMode2



ProtectedMode2:

mov eax, 0xb800
mov bh, 'p'
mov [eax], bh


Endless:
jmp Endless

17
Offtopic / Tutorial für Diskettenlaufwerk?
« am: 29. August 2004, 20:45 »
Hallo,
Weiß einer von euch wo ich Tutorials oder hilfreiche Dokumente über die Programmierung eines Floppytreibers finde?
Ich habe gegoogelt und nichts gefunden,
beim OS Resource Center ist die Sektion leer.
Bei Bona Fide gibt es ein Datasheet welches nicht viel hilft und ein Tutorial für den Realmode ich bräuchte es aber für C/C++ im PMode.
18
Offtopic / Bochs error...
« am: 19. August 2004, 19:48 »
Da mein Kernel immer abstürtzt habe ich ihn mal in Bochs laufen lassen und bekam folgende Fehlermeldung: 00030459998p[CPU  ] >>PANIC<< prefetch: running in bogus memory
Nun weiß ich aber nicht was der Bogus-Memory ist...kann mir das jemand erklären? (der Quelltext ist zu groß um ihn hier zu posten.
19
Lowlevel-Coding / Mal wieder farbprobleme
« am: 17. August 2004, 12:37 »
Hallo,
Ich habe hier einen kleinen Bootloader wie man ihn in fast jedem Tutorial finden kann und frage mich nun warum der Text keine Farbe (grün auf schwarz) hat.
Hier ist der Code:
[bits 16]
org 0x7C00

main:
    mov    ax,    0x0000
    mov    ds,    ax

    mov    si,    HelloWorld
    call    PutStr

    jmp    $

;------------------------
;    Funktionen
;------------------------
PutStr:
    mov    ah,    0x0E
    mov    bh,    0x00
    mov    bl,    0x20 ; Farbe
    .nextchar
    lodsb
    or    al,    al
    jz    .return

    int    0x10
    jmp    .nextchar
    .return
    ret
;------------------------    
;    Data
;------------------------
HelloWorld    db    'Hello, World!', 13, 10, 0

times 510 - ($ - $$) db 0
dw 0xAA55
20
Offtopic / Ziffern zu Zahl zusammen setzen?
« am: 14. August 2004, 23:00 »
Hallo,
Ich wollte mal fragen ob einer von euch ne Ahnung hat wie ich zwei (oder mehr aber das sollte ja das gleiche sein) zu einer Zahl zussamen tun kann (nein, ich meine nicht addieren).
Also ich meine das aus 1 und 2 12 wird. Wenn man 4 und 5 nimmt 45 und so weiter.
Hat jemand nen Tipp? (Möglichst in C/C++ von mir aus auch mit Std-Libs wäre aber besser ohne.)
Seiten: [1] 2

Einloggen