2014-01-12 4 views
0

В наши дни я использую язык ассемблера для самостоятельного изучения и использования MASM32. Однако я не понимаю о некоторых строках кода. Мне нужно лучшее объяснение.Объяснение Push и Pop Loop

mov eax,20 
loop1: 
push eax 
invoke StdOut, addr HelloWorld 
pop eax 
dec eax 
jnz loop1 

Без толчка и поп-музыки он будет распечатывать «Hello World» бесконечно!

Мой вопрос:

Почему мы должны нажать и поп-е регистрации?

Содержит ли StdOut значение этого регистра?

ответ

1

Поскольку вызов на STDOUT рутинных изменений, которые EAX регистр (и, возможно, это не только один ...)

Да.

1

Вы совершенно правы. Перед вызовом подпрограммы, которая может изменить один или несколько регистров, стандартная практика заключается в том, чтобы выталкивать их в стек, где они будут сохранены, перед вызовом подпрограммы. После возвращения подпрограммы вы выгружаете значения из стека в обратном порядке и сохраняете их обратно в исходных регистрах.

0

Это обычная практика, когда вы вызываете подпрограмму, что не гарантирует сохранение регистра, который вас интересует; так что вы сохраните их в стеке (нажмите) и верните их (поп) после вызова.

В некоторых случаях это может быть то, что функции гарантируют сохранение некоторых регистров, но «царапают» другие. Когда вы знаете, что существуют такие соглашения, вы можете выбрать регистр вместо другого, чтобы избежать шаблона push/pop. (Сделка выполняется просто в вызове, нажимая регистры, которые должны быть сохранены, и выкладывая их непосредственно перед возвратом вызывающему абоненту).

E.g. когда вы вызываете функцию стандартной библиотеки C («cdecl» ) на машине x86, вам нужно сохранить «только» eax, ecx и edx, если вам нужно сохранить их значения.