请考虑以下代码:
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
的人必须为ESI
“准备”ECX
和ArraySum
。
不太具体,编写函数时我应该保存哪些寄存器?只是我使用的那些没有任何人从函数之外知道它,或者我使用的所有寄存器,除了那些用于返回值的寄存器?
答案 0 :(得分:1)
在32位x86代码中,被调用者保存的寄存器(即应保留的函数)是EDI
,ESI
,EBP
和EBX
。您显示的函数会在循环内部修改ESI
,因此需要保存其原始值并在返回之前将其恢复。
ECX
是调用者保存的寄存器中的一部分(即,如果它需要的话,它是函数的调用者保持其值),所以不清楚为什么函数你'显示保存它。也许编码员制定了他/她自己的召唤惯例。