汇编(MASM)中的Push操作是否使寄存器的新值与推送值相同?

Jer*_*yRR 2 x86 assembly stack cpu-registers

我正在为我的班级在Assembly中的嵌套循环工作.我想知道的是,如果我推动ecx,我需要将另一个值移动到ecx中,还是当前的那个具有与推送的ecx相同的信息?

例:

ArraySum PROC

  push esi             ; save esi, ecx
  push ecx      
  mov eax, 0           ; set the sum to zero

L1:
  add eax, [esi]       ; add each integer to sum
  add esi, TYPE DWORD  ; point to next integer
loop L1                ; repeat for array size

  pop ecx              ; restore ecx and esi to original values
  pop esi
  ret                  ; sum is eax

ArraySum ENDP
Run Code Online (Sandbox Code Playgroud)

当我再次引用ecx它是否包含原始值5,即使该值被压入堆栈?可以说,使用与上面相同的代码,我添加一个循环.计数器是从5开始还是我需要重新初始化ecx?

我想也许这并不像我脑子里的那样措辞.我正在使用我的教科书,它确实有效.我想我的问题是,为什么它会使用ecx的原始值,如果我们推动它并且在推送后没有将另一个值移动到ecx?

PS我知道我使用的代码示例不是嵌套循环,但是这个函数在另一个循环中.并不是说它对我的问题有任何影响:)

old*_*mer 9

Push读取寄存器的内容并将其放在堆栈中,它会复制而不会触及ecx.Ecx在推动之前保留了它的内容.Pop DOES修改寄存器ecx,获取堆栈上的内容并将其写入寄存器.