调整堆栈指针以推送函数参数

Adjust stack pointer for pushing arguements for functions

通常在我为 8051 芯片编写汇编时。我在调用函数之前使用寄存器R0-R7进行争论。

mov r6, #6
mov r7, #2
lcall setpos

我有兴趣使用堆栈来执行此操作(忽略这可能效率较低的事实)。在互联网上搜索我在这个 link

中找到了一个遮阳棚

我在回答中遗漏了一些东西。在回答中他做了以下事情

push #0
push #5
call function
pop  r7 ; return value -> r7
...
function:
   pop r7
   pop r6 ; store return address
   pop b ; 5 -> b
   pop a ; 0 -> a
   add a, b
   push a  ; store result in a and push it
   push r6
   push r7
   ret

我认为每个寄存器都可以修改,包括堆栈指针,所以可以

push #4
push #8
call function
pop r7 ; result -> r7
...
function:
    dec SP ; leave return address untouched
    dec SP
    pop r4 ; 8 -> A
    pop r5 ; 4 -> B
    add A, B
    inc SP
    push A; push result
    ret

相反?我做得对吗?

你的想法还不错,因为它不需要寄存器来缓冲 return 地址,使用更少的时钟周期,并且使用更少的代码 space.

只有一个问题需要注意: 因为 return 地址在堆栈中保持其位置,所以所有 space 参数都是正在使用。在呼叫站点,您必须 POP <any>DEC SP 与呼叫前推送的数量相同。

所以你的例子应该是:

push #4
push #8
call function
pop r7 ; result -> r7
dec sp

被调用的函数在returning:

之前不能改变SP
function:
    dec SP ; leave return address untouched
    dec SP
    pop r4 ; 8 -> A
    pop r5 ; 4 -> B
    add A, B
    inc SP
    push A; push result
    inc SP
    inc SP
    ret

补充说明:PUSHPOP只取内部RAM(00H到7FH)和特殊功能寄存器(80H到0FFH)的地址) 作为参数。立即值没有变体。即使你写 PUSH R2 也使用当前寄存器组中 R2 的绝对地址。