关于相对基址变址寻址,SP堆栈指示器.它始终是指向栈顶元素.而BP不是.为什么不用SP而用BP呢?难道就是因为BP是基址寄存器.BP能指向栈顶吗?SP又有什么用?3 f$ Y5 `( %
来源:学生作业帮助网 编辑:作业帮 时间:2024/06/15 15:24:48
![关于相对基址变址寻址,SP堆栈指示器.它始终是指向栈顶元素.而BP不是.为什么不用SP而用BP呢?难道就是因为BP是基址寄存器.BP能指向栈顶吗?SP又有什么用?3 f$ Y5 `( %](/uploads/image/z/15251019-51-9.jpg?t=%E5%85%B3%E4%BA%8E%E7%9B%B8%E5%AF%B9%E5%9F%BA%E5%9D%80%E5%8F%98%E5%9D%80%E5%AF%BB%E5%9D%80%2CSP%E5%A0%86%E6%A0%88%E6%8C%87%E7%A4%BA%E5%99%A8.%E5%AE%83%E5%A7%8B%E7%BB%88%E6%98%AF%E6%8C%87%E5%90%91%E6%A0%88%E9%A1%B6%E5%85%83%E7%B4%A0.%E8%80%8CBP%E4%B8%8D%E6%98%AF.%E4%B8%BA%E4%BB%80%E4%B9%88%E4%B8%8D%E7%94%A8SP%E8%80%8C%E7%94%A8BP%E5%91%A2%3F%E9%9A%BE%E9%81%93%E5%B0%B1%E6%98%AF%E5%9B%A0%E4%B8%BABP%E6%98%AF%E5%9F%BA%E5%9D%80%E5%AF%84%E5%AD%98%E5%99%A8.BP%E8%83%BD%E6%8C%87%E5%90%91%E6%A0%88%E9%A1%B6%E5%90%97%3FSP%E5%8F%88%E6%9C%89%E4%BB%80%E4%B9%88%E7%94%A8%3F3+f%24+Y5+%60%28+%25)
关于相对基址变址寻址,SP堆栈指示器.它始终是指向栈顶元素.而BP不是.为什么不用SP而用BP呢?难道就是因为BP是基址寄存器.BP能指向栈顶吗?SP又有什么用?3 f$ Y5 `( %
关于相对基址变址寻址,SP堆栈指示器.它始终是指向栈顶元素.而BP不是.为什么不用SP而用BP呢?难道就是因为BP是基址寄存器.BP能指向栈顶吗?SP又有什么用?3 f$ 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,都不会影响堆栈的工作.