关于相对基址变址寻址

2024-12-13 08:56:10
推荐回答(2个)
回答1:

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,都不会影响堆栈的工作。

回答2:

基址寻址:其中的形式地址是可变的,基址寄存器的内容是一定的
变址寻址:形式地址不变,变址寄存器的内容可变
因此它可用于处理数组问题