ポインタ渡し
#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