質問するログイン新規登録

回答編集履歴

3

ソース追記

2019/04/24 09:57

投稿

cateye
cateye

スコア6851

answer CHANGED
@@ -58,4 +58,23 @@
58
58
  .cfi_remember_state
59
59
  .cfi_def_cfa_offset 8
60
60
  ret
61
+ ```
62
+ 同じソースを最新clang(clang version 9.0.0 (trunk 358576))に食わせてみました・・・みじかい@@;
63
+ オプション: -pipe -std=c11 -Wno-padded -Weverything -Ofast
64
+ ```asm
65
+ func: # @func
66
+ .cfi_startproc
67
+ # %bb.0:
68
+ subq $24, %rsp
69
+ .cfi_def_cfa_offset 32
70
+ leaq 20(%rsp), %rsi
71
+ movq %rsi, p2(%rip)
72
+ leaq 16(%rsp), %rdx
73
+ leaq 12(%rsp), %rcx
74
+ movl $.L.str, %edi
75
+ xorl %eax, %eax
76
+ callq printf
77
+ addq $24, %rsp
78
+ .cfi_def_cfa_offset 8
79
+ retq
61
80
  ```

2

ソース追記

2019/04/24 09:57

投稿

cateye
cateye

スコア6851

answer CHANGED
@@ -33,4 +33,29 @@
33
33
  .cfi_def_cfa 7, 8
34
34
  ret
35
35
  .cfi_endproc
36
+ ```
37
+ 最適化: -pipe -std=c11 -Wall -Ofast ↓
38
+ ```asm
39
+ func:
40
+ .LFB12:
41
+ .cfi_startproc
42
+ subq $40, %rsp
43
+ .cfi_def_cfa_offset 48
44
+ leaq .LC0(%rip), %rsi
45
+ movl $1, %edi
46
+ movq %fs:40, %rax
47
+ movq %rax, 24(%rsp)
48
+ xorl %eax, %eax
49
+ leaq 12(%rsp), %rdx
50
+ leaq 16(%rsp), %rcx
51
+ leaq 20(%rsp), %r8
52
+ movq %rdx, p2(%rip)
53
+ call __printf_chk@PLT
54
+ movq 24(%rsp), %rax
55
+ xorq %fs:40, %rax
56
+ jne .L5
57
+ addq $40, %rsp
58
+ .cfi_remember_state
59
+ .cfi_def_cfa_offset 8
60
+ ret
36
61
  ```

1

追記

2019/04/24 09:43

投稿

cateye
cateye

スコア6851

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