Assembly 堆栈指针偏移:向堆栈传递参数时调用函数
晚上好,我正在尝试调用一个基本函数,同时捕获已传递到SP的参数。当我调用该函数时,堆栈指针会更改其值,一切都会变得疯狂。我在网上看到的每个例子都没有提到调用函数时堆栈指针的变化。我做错什么了吗 这是我的密码:Assembly 堆栈指针偏移:向堆栈传递参数时调用函数,assembly,avr,Assembly,Avr,晚上好,我正在尝试调用一个基本函数,同时捕获已传递到SP的参数。当我调用该函数时,堆栈指针会更改其值,一切都会变得疯狂。我在网上看到的每个例子都没有提到调用函数时堆栈指针的变化。我做错什么了吗 这是我的密码: ;SP is initialized, SP = $21FF ;Pushing values to stack using r16 ldi R16, $44 ;wordH push r16 ;SP = $21FE ldi R16, $42 ;wordL p
;SP is initialized, SP = $21FF
;Pushing values to stack using r16
ldi R16, $44 ;wordH
push r16 ;SP = $21FE
ldi R16, $42 ;wordL
push r16 ;SP = $21FD
ldi R16, $02 ;byte
push r16 ;SP = $21FC
rcall dostuff
nop
done: rjmp done
;------Function------; (Function gutted for StackExchange)
dostuff: ;Call multiply, SP = $21F9
pop r17 ;Stuff gets wonky here
pop r18
pop r19
loop:
dec r17
breq return
rjmp loop
return:
ret
由于某种原因,当我调用该函数时,SP从$21FC更改为$21F9。我是否错误地向堆栈传递参数?或者堆栈指针是否更改以保留信息?如果是这样,我应该如何向堆栈传递参数 堆栈指针更改是因为
rcall
本身将返回地址放在那里。通常情况下,您不会在函数中弹出参数,您只需访问它们,并将删除留给将它们放在首位的调用方。如果您需要与其他代码进行互操作,请务必查阅调用约定文档。您是否建议将$21FC存储在指针变量中,并使用该变量通过post增量间接加载?是的,类似于这些内容。非常感谢你!我能够完成我开始做的事情。在YH、SPH中使用,在YL、SPL中使用,而不是弹出。为了将这些值加载到寄存器中,我使用了ldd:load with displacement
,因为ld
没有预递增,在堆栈上传递参数的另一种方法是将它们传递到寄存器中。您还可以在上面提供的link Jester中看到GCC是如何做到这一点的。堆栈指针的变化是因为rcall
本身将返回地址放在那里。通常情况下,您不会在函数中弹出参数,您只需访问它们,并将删除留给将它们放在首位的调用方。如果您需要与其他代码进行互操作,请务必查阅调用约定文档。您是否建议将$21FC存储在指针变量中,并使用该变量通过post增量间接加载?是的,类似于这些内容。非常感谢你!我能够完成我开始做的事情。在YH、SPH中使用,在YL、SPL中使用,而不是弹出。为了将这些值加载到寄存器中,我使用了ldd:load with displacement
,因为ld
没有预递增,在堆栈上传递参数的另一种方法是将它们传递到寄存器中。您还可以在上面提供的linkjester中看到GCC是如何做到这一点的。