调用子程序指令如call执行后,sp保持不变

调用子程序指令如call执行后,sp保持不变,第1张

1.调用指令CALL

调用指令CALL的基本功能就是将返回地址(即:调用指令的下一条指令的地址)压入堆栈,并转向子程序的入口地址处调用指令可分为段内调用和段间调用段内调用时,由于主程序与子程序在同一个段内,因此,调用前后,段寄存器CS的内容不会发生变化,因而,返回地址只需保存偏移地址即可,比如上述调用指令中的前两条指令段间调用时,主程序与子程序不在同一个段内,此时,调用指令执行后,CS和IP的内容都会发生变化,因此,保存的返回地址必须要包含它的段地址和段内偏移地址两个部分

子程序入亩扒拍口地址的寻址方式与无条件转移指令的待转向地址的寻址方式基本相同

(1).段内直接调用指令"CALL OPR":指令中的OPR为子程序名,它代表了子程序的入口地址,其寻址方式为相对寻址方式相对位移量是16位,它是子程序入口地址与返回地址的差值

(2).段内间接调用指令"CALL OPR1":指令中的OPR1指出了存放子程序入口地址的那个存储单元,上述指迅羡令中的EA即为OPR1的有效地址,其寻址方式可以是除了立即数寻址方式和段寄存器寻址方式之外的任何寻址方式因为是段内调用,所以,EA对应存储单元中存放的是子程序入口地址的16位偏移地址

(3).段间直接调此丛用指令"CALL FAR PTR OPR":指令中的OPR为过程名或子程序名,同样代表了过程或子程序的入口地址,其寻址方式为直接寻址方式,即:指令的机器码中直接给出了过程或子程序入口地址的段地址和偏移地址

(4).段间间接调用"CALL OPR1":指令中OPR1的含义和寻址方式与段内间接调用指令相同,不同的是有效地址EA对应存储单元中存放的是子程序入口地址的段地址和偏移地址

假设某程序中已经定义了子程序SEARCH1和PMOVE,以及变量SADR,那么,我们有以下调用指令:

CALL SREACH1段内直接调用

CALL FAR PTR PMOVE 段间直接调用

CALL BX 段内间接调用

CALL WORD PTR [BX] 段内间接调用

CALL SADR SADR是字变量,则是段内间接调用SADR是双字变量,则是段间间接调用

PUSH入栈 *** 作,遵守FILO原则(first

in

last

out),而且必须是字 *** 作,

MOV

AX,N1

PUSH

AX

这是第握雹袜一次进行压栈,SP=SP-2,存储器是8位的,而AX是16位的,高八位即AH存在高地址,而低八位AL存在低地址,SS=3000H,SP-2=00FEH

物理地址=SS*10H+SP=300FEH

MOV

AX,N2

PUSH

AX

同理SP=SP-2,此时SP=00FCH

物理地址=SS*10H+SP=3000H*10H+00FCH=300FCH

CALL

L1

调用子程序即过程调用,为了保护现场,会压栈保存断点,段内调用,说明L1的属性为NEAR,只需保存IP,SP=SP-2,但是如果是段间调用则需要保存CS和IP

那么SP=SP-4.不管怎么样,在执行完RET后,要恢复现场,即d出断点,SP=SP+2

(段间调用SP=SP+4)

也就是说过程调用前后,SP总体看不会变,但是其堆栈发段激生了一系列变化。

SP数值没变!

在这段程序执肆芦行完成后,由于两次PUSH

AX所以,总的SP=SP-4

此时物理地址=300FCH


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12342602.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存