注册 登录
编程论坛 汇编论坛

51单片机 如何在汇编语言中切换寄存器组

wsws23 发布于 2015-09-19 14:07, 4685 次点击
即主函数调用了一个有参数的子函数,子函数中有调用了一个有参数的子函数
如何用汇编实现对子函数的调用呢?
随便举个例子:
void delay(int i);
{}
void send(char j);
{
    int i;
    delay(i);
}
void main()
{    char a;
     send(a);   
}

大概就是这么个意思,求大神指点
8 回复
#2
hu9jj2015-09-20 09:21
没看明白内容,单从标题而言,子程序开始要做的事情就是对所有需要使用的寄存器入栈,子程序结束之前将入栈保存的寄存器数据依次出栈,恢复原来的数据。否则程序将不能正常运行。
#3
nooomoon2015-09-20 13:11
汇编子程序放在特定的地址。要用的时候就用call这个指令就可以。子程序最后要有一个ret指令,这个指令让子程序执行结束后又回跳到call指令之后的那个地址继续。
#4
hu9jj2015-09-21 08:02
call和ret指令仅仅针对IP寄存器数据自动保存和恢复,其他通用寄存器如果子程序要使用,必须在子程序中保存和恢复的。
#5
wmf20142015-09-21 08:45
自己用汇编写函数可以比较灵活,参数少时用寄存器,参数多了还是要用栈。不断地用call指令就可以调用你需要的函数了。
#6
wsws232015-09-25 08:33
回复 2楼 hu9jj
就是将参数放到r0-r7中啊, 51单片机不是有4组嘛,在第一次调用函数的时候用了一组寄存器了,第二组
调用寄存器的时候第一组的数据不能被覆盖,要用第二组切换。就这么个意思
#7
wsws232015-09-25 08:34
回复 6楼 边小白
对。一组寄存器不够用
#8
wfoo2015-10-13 12:12
这些寄存器应该是分页的,比如页号为0,1,2,3可以访问第0,1,2,3组寄存器。
应该有一个寄存器的功能就是存放当前页号的,它是全局的,不管上面所说的寄存器的页号为多少,功能都是一样的。
类似于功能选择寄存器,SPR? SFR?你看看你的单片机手册是不是叫这个。
1