stack - subproc mit mehr als 3 parameter
-
hallo
ich habe eine unterfunktion gebastelt, die mir einen pixel auf den bildschirm setzt im mode13h
anhand von parametern wie farbwert, x ,y ...
diese parameter schieb ich aus der main auf den stack und die unterfunktion holt sich die werte mittels pop von stack herunter...
genau so machts ja c auch, wenn man z.b. schreibt setpix(120, 200, 100);
so nun hab ich mich aber gefragt, da man ja in c auch unendlich viele parameter übergegen kann,
wie das dann in asm gehen soll...
weil ich hab folgendes problem:
zum einen muss ich in der unterfunktion zunächst die rücksprung adresse vom stack holen, dann komm ich erst
an die werte ran, die ich möchte.. aber ich hab ja nur 4 register zur verfügung
das heisst in meinem beispiel bei setpix wüsst ich jetz gar ned wie ich noch einen parameter vom stack holen
sollte, da ich ja diese wieder in umgekehrte reihenfolge pushen muss
genau das is mein prob,weil
popen kann ich so viel ich will
pop ax
pop cx
pop dx
pop ax
pop cxso und jetz ?
push cx
push ax
push dx
ja und jetz wieder push cs ?
das geht nich, der wert steht gar nich mehr in cx ...!-------------
SetPix proc near ; (farbe, x, y)
pop cx
mov ax, 0A000h ; videoram laden
mov es, axpop dx ; y-wert
mov ax, dx
mov bx, 320
mul bx
pop bx ; x-wert
add ax, bx
mov di, ax ; nun steht die vollständige Pixeladresse in ES:DI
pop ax ; pixelfarbe
stosb ; mov es:[di], alpush ax
push bx
push dx
push cx
retSetpix endp
start:
mov ah, 00h ; wechsle den grafikmodus
mov al, 13h ; modus 13h (320*200 in 8bit)
int 10hpush 120 ; farbwert
push 200 ; x-wert
push 100 ; y-wert
call SetPixwäre dankbar wenn mir jemand vielleicht helfen könntest
btw.: hab leider noch kein ausführliches asm-buch und ich schlag mich grad zur zeit noch mit irgendwelchen einsteiger-tuts durch,
welche aber bisher diese frage noch nich beantwortet haben. klar könnt ichs mit nem makro locker lösen... aber wenn
c es kann, muss es asm auch könnenmfg haMMer
[ Dieser Beitrag wurde am 12.05.2003 um 21:46 Uhr von Hammer editiert. ]
-
Normalerweise greift man nicht über pop auf die Parameter zu. Eine C-artige Aufrufkonvention (cdecl) habe ich schonmal wo beschrieben, nämlich hier:
Unterprogramm vs. Makro
-
Moin, Moin...
Hier ist meine Version:
; tasm /ml /zn setpix.asm ; tlink /c /x /Tde setpix.obj .model small .stack 512 .data .code SetPix proc near ; (farbe, x, y) pop cx mov ax, 0A000h ; videoram laden mov es, ax pop dx ; y-wert mov ax, dx mov bx, 320 mul bx pop bx ; x-wert add ax, bx mov di, ax ; nun steht die vollständige Pixeladresse in ES:DI pop ax ; pixelfarbe stosb ; mov es:[di], al push ax push bx push dx push cx ret SetPix endp NewSetPix proc near ; x, y, farbe ; Stackframe einrichten push bp mov bp, sp ; alle verwendeten Register retten ; ax muss nicht gerettet werden push bx push di push es mov ax, 0a000h mov es, ax mov ax, [bp + 6] ; hole y mov bx, 320 mul bx mov bx, [bp + 4] ; hole x add ax, bx mov di, ax mov ax, [bp + 8] ; hole farbe stosb ; gerettete Register restaurieren pop es pop di pop bx ; Stackframe auflösen mov sp, bp pop bp ret NewSetPix endp start: ; ds und es mit Segmentadresse initialisieren mov ax, @data mov ds, ax mov es, ax mov ah, 00h ; wechsle den grafikmodus mov al, 13h ; modus 13h (320*200 in 8bit) int 10h push 2 ; farbwert push 0 ; y-wert push 0 ; x-wert call NewSetPix push 128 push 199 push 319 call NewSetPix push 64 push 0 push 319 call NewSetPix push 15 push 199 push 0 call NewSetPix ; auf Tastendruck warten mov ah, 000h int 016h ; Textmodus einschalten mov ax, 00003h int 010h mov ax, 04c00h int 021h end start
Ciao...
-
THX !!!!!!
wobei das ax dennoch innerhalb der funktion gesichert werden muss,
sofern man es ausserhalb als counter benutzt, um z.b. eine for
schleife zu basteln um eine linie zu malen...mfg haMMer