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 cx

    so 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, 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

    start:

    mov ah, 00h ; wechsle den grafikmodus
    mov al, 13h ; modus 13h (320*200 in 8bit)
    int 10h

    push 120 ; farbwert
    push 200 ; x-wert
    push 100 ; y-wert
    call SetPix

    wä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önnen 😉

    mfg 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


Anmelden zum Antworten