D
Es liegt nicht an einem bestimmten Aufruf und auch nicht daran was ich der Funktion übergebe. Es liegt daran, dass ich nur x Funktionen aufrufen kann, danach spinnt es rum.
Ich kann genauso gut folgendes machen:
clearScreen();
print("A");
clearScreen();
print("B");
clearScreen();
print("C");
clearScreen();
print("D");
clearScreen();
print("E");
clearScreen();
print("F");
clearScreen();
print("G");
clearScreen();
print("H");
Rufe ich jetzt nochmal print auf, dann bekomme ich wieder eine falsche Ausgabe.
hast mal nen bisschen rumprobiert mit anderen ähnlichen inputs?
Nein. Ich frage hier, weil ich noch kein bisschen rumprobiert habe und mir die Ursache des Problemes vollkommen klar ist.
wie is cursorPosition und magic eigentlich deklariert? wieso funktioniert eigentlich: print((int)magic);
uint16 cursorPosition = 0; //global
Magic legt mir der Bootloader ins eax register, bevor er den Kernel aufruft. eax wird vorm Aufrufen der Main Funktion gepusht.
print((int)magic) funktioniert, weil es - wie bereits gesagt - nichts mit den Parametern der Funktion zu tun hat.
Ich habe noch etwas herumprobiert und das scheint mit der jump table des switches zusammenzuhängen.
möglichkeiten im switch aufrufbare funktionen
11 13
10 17
9 17
8 21
7 25
6 29
5 33
Das ist sehr merkwürdig.
Könntet ihr euch den Assembly Code der Funktion ansehen? Ich kann da keinen Fehler ausmachen.
print PROC
var_18 = dword ptr -18h
videomemory = dword ptr -14h
bufferSize = word ptr -10h
numRows = word ptr -0Ch
numColumns = word ptr -8
step = word ptr -4
ptr = dword ptr 8
color = dword ptr 0Ch
push ebp
mov ebp, esp
sub esp, 18h
mov [ebp+videomemory], 0B8000h
mov eax, 4
mov [ebp+step], ax
mov ecx, 50h
mov [ebp+numColumns], cx
mov edx, 19h
mov [ebp+numRows], dx
mov eax, 7D0h
mov [ebp+bufferSize], ax
jmp for
for:
mov eax, [ebp+ptr]
movsx ecx, byte ptr [eax]
test ecx, ecx
jz ende
movzx edx, cursorPosition
cmp edx, 2000
jl cursorValid
movzx eax, cursorPosition
sub eax, 2000
mov cursorPosition, ax
cursorValid:
mov ecx [ebp+ptr]
movsx edx, byte ptr[ecx]
mov [ebp+var_18], edx
mov eax, [ebp+var_18]
add eax, 3Ch
mov [ebp+var_18], eax
cmp [ebp+var_18], 50
ja caseDefault
mov ecx, [ebp+var_18]
movzx edx, ds:byte_101B18[ecx]
jmp ds:off_10B00[edx*4]
caseDefault:
movzx eax, cursorPosition
mov ecx, [ebp+videomemory]
mov edx, [ebp+ptr]
mov dl, [edx]
mov [ecx+eax*2], dl
movzx eax, cursorPosition
mov ecx, [ebp+videomemory]
mov dl, byte ptr [ebp+color]
mov [ecx+eax*2+1], dl
jmp loc_101AF2
;case Ä
movzx eax, cursorPosition
mov ecx, [ebp+videomemory]
mov byte ptr [ecx+eax*2], 8Eh
movzx edx, cursorPosition
mov eax, [ebp+videomemory]
mov cl, byte ptr [ebp+color]
mov [eax+edx*2+1], cl
jmp jmptblEnde
;case ö
movzx edx, cursorPosition
mov eax, [ebp+videomemory]
mov byte ptr [eax+edx*2], 94h
movzx ecx, cursorPosition
mov edx, [ebp+videomemory]
mov al, byte ptr [ebp+color]
mov [edx+ecx*2+1], al
jmp jmptblEnde
;case Ö
movzx ecx, cursorPosition
mov edx, [ebp+videomemory]
mov byte ptr [edx+ecx*2], 99h
movzx eax, cursorPosition
mov ecx, [ebp+videomemory]
mov dl, byte ptr [ebp+color]
mov [ecx+eax*2+1], dl
jmp jmptblEnde
;gefolgt von zwei weiteren cases, die den selben code jedoch mit anderen zeichen beinhalten (Ü und ü)
jmptblEnde:
mov ecx, [ebp+ptr]
add ecx, 1
mov [ebp+ptr], ecx
mov dx, cursorPosition
add dx, 1
mov cursorPosition
jmp for
ende:
mov esp, ebp
pop ebp
retn 8
print ENDP
Ich hoffe jemand findet da was.