BP指针和SP指针的区别?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BP指针和SP指针的区别?相关的知识,希望对你有一定的参考价值。

参考技术A 指针寄存器包括堆栈寄存器SP(stack
pointer)和基数指针寄存器BP(base
pointer),变
值寄存器包括源变址寄存器SI(source
index)和目的变值寄存器DI(destination
index)。这
4个寄存器都是16位寄存器,这些寄存器在运算过程中也可以用来存放操作数(只能
以字为单位),但经常的用途是在段内寻址时提供偏移地址,SP,BP一般与段寄存器SS
联用,以确定堆栈寄存器中某一单元的地址,SP用以指示栈顶的偏移地址,而BP可
作为堆栈区中的一个基地址,用以确定在堆栈中的操作数地址。SI,DI一般与段寄存器
DS联用,以确定数据段中某一存储单元的地址,SI,DI具有自动增量和自动减量的功能,
这一点使在串操作指令中用做变址非常方便,SI作为隐含的源变址DS联用,DI作为
隐含的目的变址和ES连用,从而达到在数据段和附加段中寻址的目的

指针内存分配

【中文标题】指针内存分配【英文标题】:Pointer Memory Allocation 【发布时间】:2015-04-21 23:52:39 【问题描述】:

我正在尝试深入学习指针的概念。在下面的代码中,我创建了一个数组并创建了一个指向每个元素的指针。

int bucky[5];
int *bp0 = &bucky[0];
int *bp1 = &bucky[1];
int *bp2 = &bucky[2];

cout<<"bp0 is at memory address:"<<bp0<<endl;
cout<<"bp1 is at memory address:"<<bp1<<endl;
cout<<"bp2 is at memory address:"<<bp2<<endl;

这些是分配给数组元素的内存。

bp0 位于内存地址:0x0018ff3c bp1 位于内存地址:0x0018ff40 bp2在内存地址:0x0018ff44

由于我对 c++ 的了解有限,我知道内存是连续分配给数组的。但仔细观察输出,bp0 看起来格格不入。

根据我的说法,bp0 应该在0x0018ff36。还是0x0018ff3c , 0x0018ff40 , 0x0018ff44的位置在CPU中是连续的?

那么有没有可能两个连续的内存分配不是按顺序分配的?

【问题讨论】:

十六进制不是这样工作的。 是的,它是连续的。如果指针的大小是 4 字节,那么下一个指针会放在 4 字节之后,不是吗? 为什么你认为bp0 应该是0x0018ff36 @axiac:因为他用十进制而不是十六进制思考。 @MohitBhasi 这些数字前面的0x 表示它们是使用十六进制表示法编写的(这是内存地址的常用表示法)。搜索一下关于十六进制的教程就明白了。 【参考方案1】:

每个 int 使用 4 个字节。 数组的第一个位置是 0x0018ff3c,所以下一个 int 将在 0x0018ff3c + 4

注意地址是十六进制的,所以:

0x0018ff3c + 0x00000004 = 0x0018ff40

注意:这些都是十六进制数字。顺序如下:0x3c0x3d0x3e0x3f0x400x41...

【讨论】:

哇,不知道!你能推荐一个学习内存分配方式的地方吗? @MohitBhasi:通常在你的 101 CS 课程中。和base10没什么区别,只是更大的字母表0、1、2、3、4、5、6、7、8、9、a、b、c、d、e、f 如果你对计算机如何在非常基础的层面上工作感兴趣,你应该从头开始,这样你的思想就不会被堵塞:en.wikipedia.org/wiki/Von_Neumann_architecture 这个架构真的很老了,但是原理(大部分)相同。【参考方案2】:
           +---+---+---+---+---+---+---+---+---+---+---+---+
           |      bp0      |      bp1      |      bp2      |
           +---+---+---+---+---+---+---+---+---+---+---+---+
  0x0018ff3c   d   e   f  40   1   2   3   4   5   6   7   8

假设 int 的大小为 4 字节,并且 bp0 指向 0x0018ff3c。

bp1 = bp0 + 4 = 0x0018ff40 bp2 = bp1 + 4 = 0x0018ff44

【讨论】:

ok , thx :) 所以我的解释是 8 之后有 9 然后是 a 然后是 b 然后是 c 等等? 是的,你是对的。是hexadecimal count

以上是关于BP指针和SP指针的区别?的主要内容,如果未能解决你的问题,请参考以下文章

汇编中BP是啥

函数指针与指针函数区别

通用寄存器和专用寄存器有啥区别和联系?

寄存器小记

C语言中“指针”和“指针变量”的区别是啥??

数组指针和指针数组的区别