FromNandの日記

自分的備忘録

配列を持った構造体を値渡し・ポインタ渡ししてみる

ポインタ渡し

#include<stdio.h>

typedef struct {
    int a;
    int array[100];
} STR;

void func(STR* str){
    printf("%d, %d, %d\n", str->a, str->array[0], str->array[30]);
    return;
}

int main(void){
    STR str;
    func(&str);
    return 0;
}


結果のアセンブリはこちら

0000057d <func>:
 57d:	55                   	push   %ebp
 57e:	89 e5                	mov    %esp,%ebp
 580:	53                   	push   %ebx
 581:	83 ec 04             	sub    $0x4,%esp
 584:	e8 89 00 00 00       	call   612 <__x86.get_pc_thunk.ax>
 589:	05 4b 1a 00 00       	add    $0x1a4b,%eax
 58e:	8b 55 08             	mov    0x8(%ebp),%edx
 591:	8b 5a 7c             	mov    0x7c(%edx),%ebx
 594:	8b 55 08             	mov    0x8(%ebp),%edx
 597:	8b 4a 04             	mov    0x4(%edx),%ecx
 59a:	8b 55 08             	mov    0x8(%ebp),%edx
 59d:	8b 12                	mov    (%edx),%edx
 59f:	53                   	push   %ebx
 5a0:	51                   	push   %ecx
 5a1:	52                   	push   %edx
 5a2:	8d 90 ec e6 ff ff    	lea    -0x1914(%eax),%edx
 5a8:	52                   	push   %edx
 5a9:	89 c3                	mov    %eax,%ebx
 5ab:	e8 50 fe ff ff       	call   400 <printf@plt>
 5b0:	83 c4 10             	add    $0x10,%esp
 5b3:	90                   	nop
 5b4:	8b 5d fc             	mov    -0x4(%ebp),%ebx
 5b7:	c9                   	leave  
 5b8:	c3                   	ret    

000005b9 <main>:
 5b9:	8d 4c 24 04          	lea    0x4(%esp),%ecx
 5bd:	83 e4 f0             	and    $0xfffffff0,%esp
 5c0:	ff 71 fc             	pushl  -0x4(%ecx)
 5c3:	55                   	push   %ebp
 5c4:	89 e5                	mov    %esp,%ebp
 5c6:	51                   	push   %ecx
 5c7:	81 ec a4 01 00 00    	sub    $0x1a4,%esp
 5cd:	e8 40 00 00 00       	call   612 <__x86.get_pc_thunk.ax>
 5d2:	05 02 1a 00 00       	add    $0x1a02,%eax
 5d7:	65 a1 14 00 00 00    	mov    %gs:0x14,%eax
 5dd:	89 45 f4             	mov    %eax,-0xc(%ebp)
 5e0:	31 c0                	xor    %eax,%eax
 5e2:	83 ec 0c             	sub    $0xc,%esp
 5e5:	8d 85 60 fe ff ff    	lea    -0x1a0(%ebp),%eax
 5eb:	50                   	push   %eax
 5ec:	e8 8c ff ff ff       	call   57d <func>
 5f1:	83 c4 10             	add    $0x10,%esp
 5f4:	b8 00 00 00 00       	mov    $0x0,%eax
 5f9:	8b 55 f4             	mov    -0xc(%ebp),%edx
 5fc:	65 33 15 14 00 00 00 	xor    %gs:0x14,%edx
 603:	74 05                	je     60a <main+0x51>
 605:	e8 86 00 00 00       	call   690 <__stack_chk_fail_local>
 60a:	8b 4d fc             	mov    -0x4(%ebp),%ecx
 60d:	c9                   	leave  
 60e:	8d 61 fc             	lea    -0x4(%ecx),%esp
 611:	c3                   	ret    

値渡し

#include<stdio.h>

typedef struct {
    int a;
    int array[100];
} STR;

void func(STR str){
    printf("%d, %d, %d\n", str.a, str.array[0], str.array[30]);
    return;
}

int main(void){
    STR str;
    func(str);
    return 0;
}
0000057d <func>:
 57d:	55                   	push   %ebp
 57e:	89 e5                	mov    %esp,%ebp
 580:	53                   	push   %ebx
 581:	83 ec 04             	sub    $0x4,%esp
 584:	e8 a4 00 00 00       	call   62d <__x86.get_pc_thunk.ax>
 589:	05 4b 1a 00 00       	add    $0x1a4b,%eax
 58e:	8b 9d 84 00 00 00    	mov    0x84(%ebp),%ebx
 594:	8b 4d 0c             	mov    0xc(%ebp),%ecx
 597:	8b 55 08             	mov    0x8(%ebp),%edx
 59a:	53                   	push   %ebx
 59b:	51                   	push   %ecx
 59c:	52                   	push   %edx
 59d:	8d 90 0c e7 ff ff    	lea    -0x18f4(%eax),%edx
 5a3:	52                   	push   %edx
 5a4:	89 c3                	mov    %eax,%ebx
 5a6:	e8 55 fe ff ff       	call   400 <printf@plt>
 5ab:	83 c4 10             	add    $0x10,%esp
 5ae:	90                   	nop
 5af:	8b 5d fc             	mov    -0x4(%ebp),%ebx
 5b2:	c9                   	leave  
 5b3:	c3                   	ret    

000005b4 <main>:
 5b4:	8d 4c 24 04          	lea    0x4(%esp),%ecx
 5b8:	83 e4 f0             	and    $0xfffffff0,%esp
 5bb:	ff 71 fc             	pushl  -0x4(%ecx)
 5be:	55                   	push   %ebp
 5bf:	89 e5                	mov    %esp,%ebp
 5c1:	57                   	push   %edi
 5c2:	56                   	push   %esi
 5c3:	53                   	push   %ebx
 5c4:	51                   	push   %ecx
 5c5:	81 ec a8 01 00 00    	sub    $0x1a8,%esp
 5cb:	e8 5d 00 00 00       	call   62d <__x86.get_pc_thunk.ax>
 5d0:	05 04 1a 00 00       	add    $0x1a04,%eax
 5d5:	65 a1 14 00 00 00    	mov    %gs:0x14,%eax
 5db:	89 45 e4             	mov    %eax,-0x1c(%ebp)
 5de:	31 c0                	xor    %eax,%eax
 5e0:	83 ec 0c             	sub    $0xc,%esp
 5e3:	81 ec 94 01 00 00    	sub    $0x194,%esp
 5e9:	89 e0                	mov    %esp,%eax
 5eb:	89 c3                	mov    %eax,%ebx
 5ed:	8d 85 50 fe ff ff    	lea    -0x1b0(%ebp),%eax
 5f3:	ba 65 00 00 00       	mov    $0x65,%edx
 5f8:	89 df                	mov    %ebx,%edi
 5fa:	89 c6                	mov    %eax,%esi
 5fc:	89 d1                	mov    %edx,%ecx
 5fe:	f3 a5                	rep movsl %ds:(%esi),%es:(%edi)
 600:	e8 78 ff ff ff       	call   57d <func>
 605:	81 c4 a0 01 00 00    	add    $0x1a0,%esp
 60b:	b8 00 00 00 00       	mov    $0x0,%eax
 610:	8b 55 e4             	mov    -0x1c(%ebp),%edx
 613:	65 33 15 14 00 00 00 	xor    %gs:0x14,%edx
 61a:	74 05                	je     621 <main+0x6d>
 61c:	e8 8f 00 00 00       	call   6b0 <__stack_chk_fail_local>
 621:	8d 65 f0             	lea    -0x10(%ebp),%esp
 624:	59                   	pop    %ecx
 625:	5b                   	pop    %ebx
 626:	5e                   	pop    %esi
 627:	5f                   	pop    %edi
 628:	5d                   	pop    %ebp
 629:	8d 61 fc             	lea    -0x4(%ecx),%esp
 62c:	c3                   	ret