Делает ли операция Push в сборке (MASM) новое значение регистра таким же, как и значение Push? - PullRequest
2 голосов
/ 29 ноября 2011

В настоящее время я работаю над вложенными циклами в Assembly для моего класса. Что мне интересно, так это то, что если я нажму ecx, мне нужно будет переместить другое значение в ecx или текущее будет иметь ту же информацию, что и push px?

Пример:

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?

P.S. Я знаю, что пример кода, который я использовал, не является вложенным циклом, но эта функция находится внутри другого цикла. Не то чтобы это действительно имело отношение к моему вопросу в любом случае:)

1 Ответ

9 голосов
/ 29 ноября 2011

Push считывает содержимое регистра и помещает его в стек, что делает копию без изменений. Ecx сохраняет то, что было в нем до пуша. Pop изменяет регистр ecx, беря то, что находится в стеке, и записывая его в регистр.

...