2014-01-12 74 views
0

這些天來,我使用匯編語言進行自學並使用了MASM32.但是,我不瞭解一些代碼行。我需要更好的解釋。解釋Push和Pop Loop

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

沒有推送和彈出,它會打印出'Hello World'無限!

我的問題:

爲什麼我們要push和pop EAX寄存器?

StdOut會在內部更改該寄存器的值嗎?

回答

1

因爲到STDOUT日常變化呼叫的EAX寄存器(也許這不是唯一的一個......)

是。

1

你完全正確。在調用可能會改變一個或多個寄存器的子程序之前,標準做法是在調用子程序之前將它們推入堆棧,並保存它們。子程序返回後,按照相反的順序從堆棧中彈出這些值並將它們存回原始寄存器。

0

當您調用子程序時,通常的做法是不保證您對感興趣的寄存器;所以,你將它們保存在堆棧(推),並在通話後拿回(彈出)。

在某些情況下,它可能會保留一些功能以保留一些寄存器,但「劃傷」其他寄存器。當您知道存在這樣的約定時,您可以選擇一個寄存器而不是另一個寄存器,以避免push/pop模式。 (通過推送必須保留的寄存器,並在返回調用者之前彈出它們,簡單地在被調用者中完成交易。

E.g.當您在x86機器上調用C標準庫函數(「cdecl」有效)時,如果需要保留其值,則只需保存「僅」eax,ecxedx