早教吧作业答案频道 -->其他-->
关于相对基址变址寻址,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堆...的网友还看了以下:
●IPv6地址分为3种类型,它们是(59)。(59) A.A类地址、B类地址、C类地址B.单播地址、 2020-05-26 …
IPv6地址分为3种类型,它们是(59)。A.A类地址、B类地址、C类地址B.单播地址、组播地址、任 2020-05-26 …
交换机如何知道将帧转发到哪个端口()A.用MAC地址表B.用ARP地址表C.读取源MAC地址D.读取 2020-05-31 …
何为CPU的寻址能力,表示这个能力的单位是什么?CPU的寻址能力不就是CPU能够寻址的个数么?它的 2020-06-24 …
一道老的计算机基础题做练习题的时候遇到这样一道题某处理器具有32GB的寻址能力,则该处理器的地址线 2020-06-24 …
历史学家认为我国长江下游是亚洲水稻的起源地之一,下列遗址能够证明这一观点的是()A.元谋人遗址B. 2020-07-10 …
1、一个512KB的存储器,其地址线和数据线的总和是。有那位学者知道且能详细说说计算过程、相关原理。 2020-11-08 …
关于CPU地址总线和寻址能力的问题“某CPU有20位地址总线,它有1MB的寻址能力”,20位地址总线 2020-11-08 …
下面关于IP地址与硬件地址的叙述错误的是()A、IP地址不能直接用来进行通信,在实际网络的链路上传送 2020-12-03 …
考古学家认为我国是世界上最早种植水稻的国家。下列遗址能够证明这一论点的是()A.红山文化遗址B.大汶 2020-12-23 …