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

Assembly 汇编(MASM)中的推送操作是否使寄存器的新值与推送值相同?,assembly,x86,stack,cpu-registers,Assembly,X86,Stack,Cpu Registers,我目前正在为我的类处理程序集中的嵌套循环。我想知道的是,如果我按下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

我目前正在为我的类处理程序集中的嵌套循环。我想知道的是,如果我按下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
当我再次引用ecx时,它是否包含原始值5,即使该值被推到堆栈上?假设使用与上面相同的代码,我添加了一个循环。计数器是从5点开始还是需要重新初始化ecx

我想这可能和我脑子里想的不一样。我在课本上用了这个,它确实有用。我想我的问题是,如果我们推它,但推后没有将另一个值移到ecx中,为什么它会使用ecx的原始值


另外,我知道我使用的代码示例不是嵌套循环,但该函数位于另一个循环中。这与我的问题并没有任何关系:)

Push读取寄存器的内容并将其放在堆栈上,它生成一个拷贝,而不影响ecx。Ecx保留了推之前的内容。Pop会修改寄存器ecx,获取堆栈上的内容并将其写入寄存器

Push修改堆栈,而不是register.OMG,我不知道为什么它没有被接受。这个简单的评论在我脑海中闪现出巨大的光芒。非常感谢你!对于记录,如果的操作部分没有说它将源设置为任何值,或者没有定义它,那么可以确保它没有任何效果。手册始终列出指令对体系结构状态的所有影响。