Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 堆栈指针偏移:向堆栈传递参数时调用函数_Assembly_Avr - Fatal编程技术网

Assembly 堆栈指针偏移:向堆栈传递参数时调用函数

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的参数。当我调用该函数时,堆栈指针会更改其值,一切都会变得疯狂。我在网上看到的每个例子都没有提到调用函数时堆栈指针的变化。我做错什么了吗

这是我的密码:

;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是如何做到这一点的。