在调用函数时,我可以使用什么寄存器进行推送和弹出?

时间:2014-03-28 14:01:52

标签: assembly masm

请考虑以下代码:

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 

为什么编码员决定保存ESIECX的值? 我的意思是,从某处调用ArraySum的人必须为ESI“准备”ECXArraySum

不太具体,编写函数时我应该保存哪些寄存器?只是我使用的那些没有任何人从函数之外知道它,或者我使用的所有寄存器,除了那些用于返回值的寄存器?

1 个答案:

答案 0 :(得分:1)

在32位x86代码中,被调用者保存的寄存器(即应保留的函数)是EDIESIEBPEBX。您显示的函数会在循环内部修改ESI,因此需要保存其原始值并在返回之前将其恢复。

ECX调用者保存的寄存器中的一部分(即,如果它需要的话,它是函数的调用者保持其值),所以不清楚为什么函数你'显示保存它。也许编码员制定了他/她自己的召唤惯例。

Agner Fog's "Calling conventions" document中的表4。