這些天來,我使用匯編語言進行自學並使用了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會在內部更改該寄存器的值嗎?
這些天來,我使用匯編語言進行自學並使用了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會在內部更改該寄存器的值嗎?
因爲到STDOUT
日常變化呼叫的EAX
寄存器(也許這不是唯一的一個......)
是。
你完全正確。在調用可能會改變一個或多個寄存器的子程序之前,標準做法是在調用子程序之前將它們推入堆棧,並保存它們。子程序返回後,按照相反的順序從堆棧中彈出這些值並將它們存回原始寄存器。
當您調用子程序時,通常的做法是不保證您對感興趣的寄存器;所以,你將它們保存在堆棧(推),並在通話後拿回(彈出)。
在某些情況下,它可能會保留一些功能以保留一些寄存器,但「劃傷」其他寄存器。當您知道存在這樣的約定時,您可以選擇一個寄存器而不是另一個寄存器,以避免push/pop
模式。 (通過推送必須保留的寄存器,並在返回調用者之前彈出它們,簡單地在被調用者中完成交易。
E.g.當您在x86機器上調用C標準庫函數(「cdecl」calling-convention有效)時,如果需要保留其值,則只需保存「僅」eax
,ecx
和edx
。