Bitmap, wie erstellen?



  • Hi,
    ich mache mich grade an die Speicherverwaltung, und habe mich für die Bitmap entschieden, aber wie kann man die erstellen? Eine Variable ist zu kurz und außerdem kann man keine Nullen hinter eine Null hängen. Was gibt es für Möglichkeiten?

    LG



  • Arrays.

    Eine Variable ist zu kurz und außerdem kann man keine Nullen hinter eine Null hängen.

    Wenn Du das meinst, was ich vermute, dann stimmt das nicht. Ein 32-bit-Wert besteht aus 32 Stellen. Immer, egal wo da eine 0 und wo da eine 1 steht. Beschäftige dich mal damit, wie so eine Zahl mit fester Breite funktioniert, und vor allem mit Bitoperationen (wirst Du für deine Bitmap ja eh brauchen).



  • Wie kann man in einer Bitmap nach einer 0 suchen? mit == und != funktioniert das nicht (was natürlich klar ist 😉 )



  • Das meine ich mit: Schau Dir Bitoperationen an. Damit geht es.



  • LightBoom schrieb:

    Wie kann man in einer Bitmap nach einer 0 suchen? mit == und != funktioniert das nicht (was natürlich klar ist 😉 )

    Hallo,

    Wenn Du ein Bitfeld nutzen möchtest liegen alle Bit's hintereinander im Speicher.

    01001011_11100001_00000000_10100000_00101111_10011111
    +0       +1       +2       +3       +4       +5
    

    Das sind 6 Byte im Speicher.
    Wenn der Beginn der Bitmap z.B. bei 0x300000h liegt (3 MB) kannst du das 17. Bit so testen:

    mov eax, 17d		;EAX enthält die Bitposition die geprüft werden soll
    	xor edx, edx		;EDX immer löschen vor MUL und DIV
    	mov ebx, 8d		;17 / 8 da 8 Bit ein Byte sind
    	div ebx
    				;EAX = 2 und EDX = 1
    
    	mov ecx, edx		;den Rest nach ECX kopieren für Shift-Befehl
    	mov ebx, 0x300000h	;EBX zeigt auf Beginn der Bitmap
    	add ebx, eax		;Wir addieren 2 Byte dazu
    	xor eax, eax		;EAX löschen
    	mov al, byte [ebx]	;AL = das Byte mit dem gesuchten Bit
    	mov ah, 0x80		;in AH setzt du Bit 7 und shiftest CL Bit nach rechts
    	shr ah, cl
    	test al, ah		;Nun noch testen ob das Bit gesetzt ist oder nicht
    	jz .seite_leer		;Wenn dort eine NULL steht ist die Seite frei
    mov eax, -1			;Rückgabe bei Fehler = -1 (oder NULL geht auch) wenn Bit = 1
    ret
    
    .seite_leer:
    mov eax, 1d			;Rückgabe = 1 (True) wenn Bit 0
    ret
    

    Wenn du kein Speichermangel hast solltest du Paging verwenden, das ist nicht so schwer, nur immer umständlich beschrieben 👍

    Gruß, Nicky


Log in to reply