Search code examples
assemblystackmotorola68000

Passing parameters on the stack


When you pass parameters to a function on the cpu stack,

You put the parameters on then JSR puts the return address on the stack. So that means in your function you must take the top item of the stack (the return address) before you can take the others off)

The return value is stored by convention in register D0.

eg is the following the correct way to go about it:

...
|Let’s do some addition with a function,
MOVE.L #4, -(SP)
MOVE.L #5, -(SP)
JSR add
        |the result of the addition (4+5) is in D0 (9)
...

add: 
    MOVE.L   (SP)+,  A1     |store the return address
                            |in a register
    MOVE.L  (SP)+, D0       |get 1st parameter, put in D0
    MOVE.L  (SP)+, D2       |get 2nd parameter, put in D2

    ADD.L      D2, D0       |add them, 
                            |storing the result in D0
    MOVE.L  A1, -(SP)       |put the address back on the 
                            |Stack
    RTS                     |return

Solution

  • No.

    The callee (the target function) is generally not responsible for removing its own arguments. The caller put them there, and is the one who best knows how to remove them.

    And on the 68000, it's easy to read using a relative offset into the stack, there's no need to physically remove (pop) the arguments from the stack. This goes around the problem of having to "double-buffer" the return address quite nicely.

    So, your code ought to read something like this:

        MOVE.L #4, -(SP)
        MOVE.L #5, -(SP)
        JSR add
        ADDQ.L #8, SP           |remove the arguments from the stack, both at once.
    
    ...
    
    add: 
        MOVE.L  4(SP), D0       |get 1st parameter, put in D0
        ADD.L   8(SP), D0       |add the 2nd parameter
        RTS                     |return