which registers must be preserved for the caller
Mason
slash.tmp@free.fr
Tue Aug 22 13:42:00 GMT 2017
On 22/08/2017 15:16, Andrew Makhorin wrote:
> I asked my question, because GCC doesn't seem to follow System V ABI.
> In the following example %ebx, %esi, and %edi are not preserved being
> clobbered by the generated code.
I think you have misread the generated assembly code.
See below.
> mao@corvax:~/Desktop/foo$ cat foo.c
> int foo(int x[], int y[], int z[], int i, int j, int k)
> {
> int t;
> t = (x[i+j] + y[j+k] + 2) * (z[i+j+k] + 1) * (z[k+1] + 2);
> return t;
> }
> mao@corvax:~/Desktop/foo$ gcc -c -O2 -save-temps foo.c
> mao@corvax:~/Desktop/foo$ cat foo.s
> .file "foo.c"
> .text
> .p2align 4,,15
> .globl foo
> .type foo, @function
> foo:
> .LFB0:
> .cfi_startproc
> subl $12, %esp
> .cfi_def_cfa_offset 16
> movl 32(%esp), %eax
> movl 36(%esp), %edx
> movl %ebx, (%esp)
Here, ebx is saved on the stack.
> .cfi_offset 3, -16
> movl 28(%esp), %ebx
> movl %esi, 4(%esp)
Here, esi is saved on the stack.
> movl 24(%esp), %ecx
> movl %edi, 8(%esp)
Here, edi is saved on the stack.
> .cfi_offset 6, -12
> .cfi_offset 7, -8
> movl 20(%esp), %edi
> leal (%eax,%edx), %esi
> addl %eax, %ebx
> movl 16(%esp), %eax
> movl (%eax,%ebx,4), %eax
> addl %edx, %ebx
> movl (%ecx,%ebx,4), %ebx
> addl (%edi,%esi,4), %eax
> movl 4(%ecx,%edx,4), %edx
> movl 4(%esp), %esi
Here, esi is restored from the stack.
> addl $1, %ebx
> addl $2, %eax
> movl 8(%esp), %edi
Here, edi is restored from the stack.
> imull %ebx, %eax
> movl (%esp), %ebx
Here, ebx is restored from the stack.
> addl $12, %esp
> .cfi_restore 7
> .cfi_restore 6
> .cfi_restore 3
> .cfi_def_cfa_offset 4
> addl $2, %edx
> imull %edx, %eax
> ret
> .cfi_endproc
> .LFE0:
> .size foo, .-foo
> .ident "GCC: (Debian 4.7.2-5) 4.7.2"
> .section .note.GNU-stack,"",@progbits
> mao@corvax:~/Desktop/foo$ gcc --version
> gcc (Debian 4.7.2-5) 4.7.2
More information about the Gcc-help
mailing list