关于入栈和出栈的理解

        关于入栈和出栈的理解:假设程序在运行,这个时候就会涉及到下面要说到的几个核心的寄存器(对栈进行操作)就是PC寄存器(为了能够准确地记录各个线程正在执行的当前字节码指令地址,最好的办法自然是为每一个线程都分配一个PC寄存器这样一来各个线程之间便可以进行独立计算,从而不会出现相互干扰的情况。)、CPU的Rx寄存器、累加器、SP寄存器-栈顶指针。详细解析多翻下资料鄙人能力有限这里简说啦。程序正常运行时,会用到了这几个寄存器,因为它们使用是不受限制的所以可以理解为:公用寄存器;

准备工作都做好了,下面描述下入栈和出栈到底是什么鬼! 《 栈的结构是“先进后出“的,就像我们玩的堆积木一样,往往最先放的那块放永远在最底下,它总是最先被压的对象。随着一直往上加积木,先放的总是被后放的压在下面,一直加一直加直到积木完成。综上所述估计你们已经猜到了这个游戏规则怎么玩了。没错就像你们想的一样!出栈原理:拆积木,而且总是从最上面拿掉积木,这个要记住。》
上面说到了SP寄存器-栈顶指针,这家伙是个主角 因为入栈和出栈都跟它有关系:入栈的时候作为栈顶新来的数据元素必定会压在栈顶的上面,出栈的时候作为栈顶底下被压着的数据元素随机一位要出栈的话原来栈顶让出,接着底下被压着的那位数据元素出来,出来后必定会压在栈顶的上面,因为刚才说了新来的总是在最上面。

        一般来说栈有两种内存结构,一种是连续的,一种是不连续的,连续的基本上就是数组了,不连续的基本上就是按照链表类型存放的。链表类型就是说,每个节点都有个指针指向它下一个节点。这样链表就串起来了也就有了联系;

       比如当我们的函数发生中断需要处理中断时是要进中断函数的,在中断函数里面也是要进行各种运算的,也需要用到那几个公用寄存器,怎么处理呢?这里入栈和出栈就派上用场了。入栈:寄存器元素先暂时写到内存里去也就是栈,在中断服务函数里面,照常使用公用寄存器进行运算,等在中断函数执行完毕后,出栈:刚刚暂时保存在内存里的元素重新读到公用寄存器,来来回回操作入栈和出栈就是这么个原理

还希望有大佬指出不足之处!

转载引用文章请声明文章来源于此处谢谢~


 

  • 5
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的共享入栈操作的示例代码: ```c #include <stdio.h> #define MAX_SIZE 10 typedef struct { int data[MAX_SIZE]; int top1; // 1的顶指针 int top2; // 2的顶指针 } SharedStack; void initStack(SharedStack *stack) { stack->top1 = -1; // 初始化1的顶指针 stack->top2 = MAX_SIZE; // 初始化2的顶指针 } int isFull(SharedStack *stack) { return stack->top1 + 1 == stack->top2; // 判断共享是否已满 } int isEmpty(SharedStack *stack, int stackNum) { if (stackNum == 1) { return stack->top1 == -1; // 判断1是否为空 } else { return stack->top2 == MAX_SIZE; // 判断2是否为空 } } void push(SharedStack *stack, int stackNum, int value) { if (isFull(stack)) { printf("Shared stack is full. Cannot push element.\n"); return; } if (stackNum == 1) { stack->data[++stack->top1] = value; // 入栈1 } else { stack->data[--stack->top2] = value; // 入栈2 } } int pop(SharedStack *stack, int stackNum) { if (isEmpty(stack, stackNum)) { printf("Stack %d is empty. Cannot pop element.\n", stackNum); return -1; } if (stackNum == 1) { return stack->data[stack->top1--]; // 从1出栈 } else { return stack->data[stack->top2++]; // 从2出栈 } } int main() { SharedStack stack; initStack(&stack); // 初始化共享 push(&stack, 1, 10); // 将元素10入栈1 push(&stack, 2, 20); // 将元素20入栈2 int element1 = pop(&stack, 1); // 从1出栈 int element2 = pop(&stack, 2); // 从2出栈 printf("Popped element from stack 1: %d\n", element1); printf("Popped element from stack 2: %d\n", element2); return 0; } ``` 这是一个简单的共享的实现,其中使用一个结构体来表示共享,包含一个数组和两个顶指针。通过调用相应的入栈出栈函数,可以将元素推入或弹出共享的不同中。在示例中,元素10被推入了1,元素20被推入了2,并通过出栈操作分别弹出了这两个元素。 希望这个示例能够帮助你理解共享入栈出栈操作。如果还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值