0

在我的程序中,我将一些值推入堆栈

for (i=0;i<i2;i++)
    { 
    _asm
       {  
       mov eax,i   // i here is an (int)
       push eax 
       }
    }       

然后当我完成后,我像这样恢复堆栈:

for (i=0;i<i2;i++)
    { 
    _asm
       {  
       pop eax  // eax in not used later
       }
    }       

工作正常,但可能会浪费周期。像这样恢复堆栈是否可以:

i=i2*sizeof(int);
_asm
   {  
   add sp,i
   }
4

2 回答 2

0

不完全确定它是否有效,但看起来最后一个可以用LEA ESP, [ESP+4*EAX]. 保存一个额外的乘法并保持您的条件标志不变。

于 2014-06-23T22:10:25.640 回答
0

只要算术正确完成,这将起作用。我通常的错误是在这些事情上一视同仁。

您还可以查看enterleave指令来做类似的事情。

于 2014-06-23T21:52:31.430 回答