我应该写一个形状为

最佳答案

正如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/

    10-11 06:25