回答編集履歴

3

ソース追記

2019/04/24 09:57

投稿

cateye
cateye

スコア6851

test CHANGED
@@ -119,3 +119,41 @@
119
119
  ret
120
120
 
121
121
  ```
122
+
123
+ 同じソースを最新clang(clang version 9.0.0 (trunk 358576))に食わせてみました・・・みじかい@@;
124
+
125
+ オプション: -pipe -std=c11 -Wno-padded -Weverything -Ofast
126
+
127
+ ```asm
128
+
129
+ func: # @func
130
+
131
+ .cfi_startproc
132
+
133
+ # %bb.0:
134
+
135
+ subq $24, %rsp
136
+
137
+ .cfi_def_cfa_offset 32
138
+
139
+ leaq 20(%rsp), %rsi
140
+
141
+ movq %rsi, p2(%rip)
142
+
143
+ leaq 16(%rsp), %rdx
144
+
145
+ leaq 12(%rsp), %rcx
146
+
147
+ movl $.L.str, %edi
148
+
149
+ xorl %eax, %eax
150
+
151
+ callq printf
152
+
153
+ addq $24, %rsp
154
+
155
+ .cfi_def_cfa_offset 8
156
+
157
+ retq
158
+
159
+ ```

2

ソース追記

2019/04/24 09:57

投稿

cateye
cateye

スコア6851

test CHANGED
@@ -69,3 +69,53 @@
69
69
  .cfi_endproc
70
70
 
71
71
  ```
72
+
73
+ 最適化: -pipe -std=c11 -Wall -Ofast ↓
74
+
75
+ ```asm
76
+
77
+ func:
78
+
79
+ .LFB12:
80
+
81
+ .cfi_startproc
82
+
83
+ subq $40, %rsp
84
+
85
+ .cfi_def_cfa_offset 48
86
+
87
+ leaq .LC0(%rip), %rsi
88
+
89
+ movl $1, %edi
90
+
91
+ movq %fs:40, %rax
92
+
93
+ movq %rax, 24(%rsp)
94
+
95
+ xorl %eax, %eax
96
+
97
+ leaq 12(%rsp), %rdx
98
+
99
+ leaq 16(%rsp), %rcx
100
+
101
+ leaq 20(%rsp), %r8
102
+
103
+ movq %rdx, p2(%rip)
104
+
105
+ call __printf_chk@PLT
106
+
107
+ movq 24(%rsp), %rax
108
+
109
+ xorq %fs:40, %rax
110
+
111
+ jne .L5
112
+
113
+ addq $40, %rsp
114
+
115
+ .cfi_remember_state
116
+
117
+ .cfi_def_cfa_offset 8
118
+
119
+ ret
120
+
121
+ ```

1

追記

2019/04/24 09:43

投稿

cateye
cateye

スコア6851

test CHANGED
@@ -1 +1,71 @@
1
1
  まず考えられるのは、復帰先アドレスに8バイト(64ビット環境)と関数内利用のレジスタ(bp?など)の退避域+パディングでしょうね?
2
+
3
+ 「追記」わたしも最近のコンパイラの吐くアセンブラには疎いのですが概ね合っているように思います。
4
+
5
+ こちらでコンパイルしたアセンブラソース(最適化なし,func()のみ)です。サイズなどは合っているようですが、微妙に違う(たぶんGCCのバージョンによるものと思います:gcc (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0)
6
+
7
+ ```asm
8
+
9
+ func:
10
+
11
+ .LFB0:
12
+
13
+ .cfi_startproc
14
+
15
+ pushq %rbp ←ベースポンタ退避
16
+
17
+ .cfi_def_cfa_offset 16
18
+
19
+ .cfi_offset 6, -16
20
+
21
+ movq %rsp, %rbp
22
+
23
+ .cfi_def_cfa_register 6
24
+
25
+ subq $32, %rsp
26
+
27
+ movq %fs:40, %rax
28
+
29
+ movq %rax, -8(%rbp)
30
+
31
+ xorl %eax, %eax
32
+
33
+ leaq -20(%rbp), %rax
34
+
35
+ movq %rax, p2(%rip)
36
+
37
+ leaq -12(%rbp), %rcx ←a
38
+
39
+ leaq -16(%rbp), %rdx ←b
40
+
41
+ leaq -20(%rbp), %rax ←c
42
+
43
+ movq %rax, %rsi
44
+
45
+ leaq .LC0(%rip), %rdi ←printfに渡す文字列のアドレス(たぶんw)
46
+
47
+ movl $0, %eax
48
+
49
+ call printf@PLT
50
+
51
+ nop
52
+
53
+ movq -8(%rbp), %rax
54
+
55
+ xorq %fs:40, %rax
56
+
57
+ je .L2
58
+
59
+ call __stack_chk_fail@PLT
60
+
61
+ .L2:
62
+
63
+ leave
64
+
65
+ .cfi_def_cfa 7, 8
66
+
67
+ ret
68
+
69
+ .cfi_endproc
70
+
71
+ ```