我应该写一个形状为
最佳答案
正如Jester指出的那样,这是一个愚蠢的任务,但是,如果您对堆栈了解得很好,那么您应该能够以任何方式解决它。
您当前的代码可以:
; For example let's say sp = 54 (address 54 in memory)
push ax ; store argument n, sp = 52
call suma ; do the call
; inside suma under the argument there are pushed also
; return address by CALL, sp =50
; and old bp by PUSH bp, sp = 48
; then [sp+4] points to argument n (48+4 = 52)
; stack is restored by the function ("ret 2"), sp = 54
现在,如果您要将结果放置在堆栈上,则必须从调用者的 Angular 保留堆栈空间,因为在
suma
返回之后,sp
在我的示例中将还原为“54”,并且从堆栈上写入的所有内容较低的suma
地址上的sp
调用可能已经被覆盖(例如,如果ret 2
与您的下一条指令之间发生中断,则该中断确实使用了地址54下的堆栈存储器)。并且任何写入地址54+的内存的内容都可以保留给调用方,但会破坏调用方存储在其中的值。顺便说一句,您当前正在讨论的代码不会以
ax
返回结果,因为它以错误的方式进行递归时会覆盖自身,并且会在地址sum
处累积内存,该内存未由suma
初始化,因此它只能工作一次。可以这样写,即使对于多次调用,递归也将返回正确的总和(首先将总和清零,然后调用F(n-1)并根据需要添加“n”以得出该F(n- 1))。因此,要么确定要返回值而不是参数n,要么必须:
suma
内的[ebp+4]
内存中ret
返回(不从堆栈释放参数)call suma
之后的pop ax
从堆栈或者在参数上方保留堆栈空间,例如:
sub sp,2 ; make space for result in stack
; you can also use another bogus "push ax", not caring about value, just adjusting sp
push ax ; push argument n
call suma
pop ax ; read result + restore stack
然后在
suma
内部,您必须将结果存储到[bp+6]
中,ret 2
保持原样,仅释放参数。无论哪种方式,调用者都必须保留堆栈空间,因为任何未保留的堆栈空间(低于
sp
的当前值)都可以在任何时候被中断处理程序覆盖(在x86 16b实模式下)。关于c++ - 程序中的抽象类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47249697/