Probleme mit impelemtierung von setpixel (realmode , mode13h)
-
Hallo , an alle.
Ich spiele gerade mit mode13h etwas rum. Funktioniert gut und ohne Probleme.
Da es ziemlich "unübersichtlich" wird wenn ich jedes mal etwas in 0xa000:0x0000
schreibe , habe ich entschlossen ne Funktion setpixel zu erstellen.Naja , und genau hier ist das Problem...bin halt noch Assembler Anfänger...
Die Argumente an diese Funktion _sollen_ über den _Stack_ überreicht werden.
(Halt genau so wie in C);
Aus der C Sicht soll die Funktion folgendermaßen aussehen:void setpixel(unsigned short x , unsigned short y , unsigned byte color);
ps: Ich benutze NASM!!!!!!
Außerdem hab ich bis jetzt Argumente C-mäßig nur im 32Bit-pm übergeben;
Unter 32bit ist ja das erste Argument in [ebp+8] , das zweite in [ebp+12] , etc
...wie ist es im 16bit (real mode)???Das sind die Argumente nur 16bit klein...
Irgenwie funkt des net.
Nunja , hier der asmcode , wo nicht (richtig) funktioniert:bits 16 start: push bp mov bp , sp call init_mode13h push word 10 ; y push word 10 ; x push word 0x0101 ; color call setpixel pop bx pop bx pop bx push word 0x0101 ; color push word 11 ; y push word 11 ; x call setpixel pop bx pop bx pop bx push word 0x0101 ; color push word 12 ; y push word 12 ; x call setpixel pop bx pop bx pop bx mov dx , 0x0060 .kl: in al , dx cmp al , 0x01 jne .kl call init_textmode mov sp , bp pop bp ret init_mode13h: ; *** void init_mode13h(void); *** push ax mov ax , 0x0013 int 0x10 pop ax ret init_textmode: ; *** void init_textmode(void); *** push ax mov ax , 0x0003 int 0x10 pop ax ret setpixel: push bp mov bp , sp push ax push bx mov ax , 0xa000 mov es , ax mov ax , 320 mul word [bp+8] ; y add ax , [bp+6] ; x mov bx , ax mov ax , [ebp+10] ; color mov [es:bx] , ah ; set pixel pop bx pop ax mov sp , bp pop bp ret
Ich weiß , der code ist schlecht und Anfängerhaft , aber kann mir jemand weiterhelfen wie ich die setpixel routine in assembler am besten implemntiere?
...also der code von setpixel und wie ich die args übergebe...
color ist eigenlich nur ein byte groß aber wie soll ich es übergeben? Als word?
-
Mein pragmatischer Ansatz ist immer, dass ich eine solche Funktion mit dem Compiler compile und mir einfach anschaue, auf welche Adresse welches Argument gewandert ist.
-
Gut , aber dann bracuhe ich nen 16 compiler...hab ich net...ich will ja des in assembler schreiben...
Kann mir jemand helfen? Code? Am besten auf meinem basierend...
-
Wenn du es nicht für einen Compiler machst, dann kannst du doch die calling convention so machen, wie du willst. Dann würde ich die Koordinaten einfach in Registern übergeben.
-
Beispiel bitte: Es sollte funktionieren.
-
Ich übergebe mit Absicht im C/C++ Stil. Vielleicht wrde ich päter diesen code in c/c++ nutzen...und au0erdem ist es SO gut strukturiert...
-
Hi.
Falls deine Intention ist, eine funktionierende Pixel-Prozedur in Assembler zu implementieren:
* Selber denken? (Ok, erfordert ein wenig anstrengung - Code von irgendwo kopieren und noch nichtmal richtig verstehen duerfte dir aber auch nicht weiterhelfen)
* int 10h Setpixel-Funktion benutzen? (die sollte nicht viel langsamer als so eine Prozedur sein - Pixel derart einzeln setzen ist sowieso reichlich lahm und eignet sich hoechstens fuer Plotter - auf keinen Fall aber um groessere Bilder darzustellen)
* Einen Blick in die FAQ riskieren?Falls deine Intention ist, etwas ueber die Callingconventions zu lernen:
* Decompiliere die mit dem Compiler deiner Wahl erstellten Programme.
* Befrage google - dazu gibt es massig Seiten.Falls deine Intention ist, eine Pixel-Prozedur zu implementieren:
Benutze etwas anderes als Assembler.BTW:
Gute Strukturierung in Assembler ist IMHO ein relativer Begriff. Effektivitaet ist wichtiger.
Ich wuerde dein Vorhaben je nach Intention einfach nur unsinnig nennen.
-
Um deine erste Frage zu beantworten: das erste Argument liegt in [bp+4].
Klar, denn auf [bp+0] liegt das gepushte bp, und in [bp+2] liegt die Rücksprungadresse.
-
Ringding schrieb:
Um deine erste Frage zu beantworten: das erste Argument liegt in [bp+4].
Klar, denn auf [bp+0] liegt das gepushte bp, und in [bp+2] liegt die Rücksprungadresse.
Danke , das dürfte mir weiterhelfen.
@Nobuo T:
1 : Ich will die setpixel funktion _selber_ schreiben
2 : Wenn ich Bilder darstellen will , dann schreibe ich ne andere Funktion , die dies erledigt...
3 : Natürlich hilft es mir nicht weiter fremden code abzutippen! Ich wollte auch ein code Beispiel wo möglichs auf meinem oben angezeugtem code basiert...also ich wollte nur wissen was da falsch/verbesserungswürdig ist
4 : Ob mein Vorhaben schwachsinnig ist oder nicht , das ist meine Sache
-
So! Jetzt funktioniert mein code gut!!!Die setpixel routine funkt!!!
Dank an Ringding!!! Das Problem war , da ich net wusste wo die Argumente auf'm Stack liegen.(im 16bit modus)