BP指针和SP指针的区别?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BP指针和SP指针的区别?相关的知识,希望对你有一定的参考价值。
参考技术A 指针寄存器包括堆栈寄存器SP(stackpointer)和基数指针寄存器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
注意:这些都是十六进制数字。顺序如下:0x3c
、0x3d
、0x3e
、0x3f
、0x40
、0x41
...
【讨论】:
哇,不知道!你能推荐一个学习内存分配方式的地方吗? @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指针的区别?的主要内容,如果未能解决你的问题,请参考以下文章