sdram_block_write_PINOUT_V1_IS42S16400F:
//r0 adjusted buffer pointer
//r1 jump amount
//r2 resource id of dq
//r3 resource id of we
//sp[1] resource id of ras
//sp[2] stop time
stw r4, sp[0]
从XMOS ABI,第一个3参数调用C程序通过r0保存. . r3和其他通过堆栈。 同意第一个3寄存器传递正确。 然而,将从堆栈指针不sp[0]呢? (而非sp[1])
具体地说,什么是第一个位置传递参数在堆栈上?
这应该是:
r0
r1
r2
r3
sp[0] // resource id of ras
sp[1] // stop time
或者我的误解? 进一步增加我的困惑,r4存储压入堆栈在sp[0]吗? (不是免费的,应该是sp[2])。 将尝试检查C例程的汇编程序(编译)代码,以便更好地理解这个新主题站在我们这一边。
回答:
在进入传递到该函数的第一个参数在堆栈上传入sp[1](sp[2]的后续参数传递中,sp[3],等等)。 没有参数存储在sp[0]但被允许写这个位置。 这意味着被可以扩展堆栈和保存链接寄存器的值(lr)使用entsp指令函数的开始。 虽然被通常会使用sp拯救了lr(0)不需要这样做,节省了另一个值,如r4是完全有效的。