考慮下面的代碼:調用函數時會註冊什麼?
ArraySum PROC
; Receives: ESI points to an array of doublewords,
; ECX = number of array elements.
; Returns: EAX = sum
;-----------------------------------------------------
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,4 ; point to next integer
loop L1 ; repeat for array size
pop ecx ; restore ECX, ESI
pop esi
ret
ArraySum ENDP
爲什麼編碼器決定拯救的ESI
和ECX
值是多少? 我的意思是,從某處撥打ArraySum
的人必須爲ArraySum
「準備」ESI
和ECX
。
不太具體,我應該在寫函數時保存哪些寄存器?只是我使用的函數沒有任何人知道它的函數外,或者我使用的所有寄存器除了用於返回值的函數外?
這是平臺特定的,但在32位Windows上,我也相信Linux,例程可以垃圾'eax','ecx'和'edx',但必須保留所有其他寄存器值。 –
x86中有太多「標準」可靠地選擇一個。大約20年前有很多工具供應商。你必須參考你所使用的任何編譯器的文檔。這是一個古老的順便說一句,沒有人再生成LOOP。 –
@HansPassant,我正在閱讀的文本中的標準(代碼來自哪裏)是否有可能是編碼器必須保留所有通用寄存器以期望返回值? – Quaker