早教吧作业答案频道 -->其他-->
关于相对基址变址寻址,SP堆栈指示器.它始终是指向栈顶元素.而BP不是.为什么不用SP而用BP呢?难道就是因为BP是基址寄存器.BP能指向栈顶吗?SP又有什么用?3f$Y5`(%
题目详情
关于相对基址变址寻址,SP堆栈指示器.它始终是指向栈顶元素.而BP不是.为什么不用SP而用BP呢?难道就是因为BP是基址寄存器.BP能指向栈顶吗?SP又有什么用?3 f$ Y5 `( %
▼优质解答
答案和解析
SP是堆栈指针寄存器,专门用来维护堆栈的,诸如POP,PUSH,CALL等指令都是跟SP相关的,所以SP对于程序来说是应该是只读的,而实际上你可以手动设置SP的值.如果用SP作为基地址的话,会出错的.而BP是堆栈的基址指针,如果不使用段超越标志的话,BP实际上是SS:BP,就像SI默认是DS:SI ,DI默认是ES:DI,这是一样的道理.
BP在C语言程序中使用广泛,例如下面的C程序编译为汇编应该是这样
//C:
int sum(int a,int b )
{
DoSometing();
return a+b;
}
...//在其他的函数中
c=sum(1,2);
...
;ASM:
sum proc
push bp
mov bp,sp ;将sp的值送到bp,让bp指向栈顶
call DoSomething
mov ax,[bp+4] ;[bp+4] = a
add ax,[bp+6] ;[bp+6] = b
pop bp
ret 4
sum endp
...;在其他的函数中
mov ax,2 ;第二个参数
push ax
mov ax,1 ;第一个参数
push ax
call sum
mov addr_c,ax ;addr_c是我假定的c变量的地址.
...
从以上的例子看来,使用BP是正确的,而不应该是SP,SP是专用寄存器,不要动它为好.将它的值送给BP就行了,不管你之后执行了inc bp 还是 add bp,2,都不会影响堆栈的工作.
BP在C语言程序中使用广泛,例如下面的C程序编译为汇编应该是这样
//C:
int sum(int a,int b )
{
DoSometing();
return a+b;
}
...//在其他的函数中
c=sum(1,2);
...
;ASM:
sum proc
push bp
mov bp,sp ;将sp的值送到bp,让bp指向栈顶
call DoSomething
mov ax,[bp+4] ;[bp+4] = a
add ax,[bp+6] ;[bp+6] = b
pop bp
ret 4
sum endp
...;在其他的函数中
mov ax,2 ;第二个参数
push ax
mov ax,1 ;第一个参数
push ax
call sum
mov addr_c,ax ;addr_c是我假定的c变量的地址.
...
从以上的例子看来,使用BP是正确的,而不应该是SP,SP是专用寄存器,不要动它为好.将它的值送给BP就行了,不管你之后执行了inc bp 还是 add bp,2,都不会影响堆栈的工作.
看了 关于相对基址变址寻址,SP堆...的网友还看了以下:
物体加速度与位移的问题物体的初速度为2m/s,加速度为2m/s2,当它的速度增加到6m/s时,所经 2020-04-25 …
she's in a shirt today和she's in shirt today哪种说法对? 2020-05-16 …
一个做直线运动的物体,某时刻速度是10m/s,那么这个物体( )如果从这一时刻起开始匀速运动,那么 2020-05-16 …
某物体做变速直线运动,已知他在前一半路程的速度为某一物体做变速直线运动,已知它在前一半路程的速度为 2020-05-17 …
都说SATA3.0的传输速率是600MB/s怎么有的是标的是6Gb/s换算错了吧?就算要换算成Gb 2020-06-13 …
一架喷气式飞机,飞行速度是800m/s,如果它喷出的气体相对飞机的速度小于800m/s,那么以地面 2020-06-25 …
如图所示,小狗吉米在镜前欣赏自己的像,它扶着镜子以0.1m/s速度水平向右移动,则像相对于它的移动 2020-07-14 …
在HestudyinNO.4HighSchool中,study要加s吗study什么时候要去"y" 2020-07-24 …
偏导数的问题F(s,t)s=(x,y)t=(x,y)求F对X的二阶偏导数一阶出现一个F对s的偏导数 2020-08-02 …
1.一只在静水中的速度为0.4m/s,它要渡过一条宽度为40m的河,河水的流速为0.3m/s.则下列 2020-12-09 …