読者です 読者をやめる 読者になる 読者になる

volatileの影響をアセンブリで比較

volatileはコンパイラによる最適化を抑止する修飾子のことだった気がする。

volatileの有無により、アセンブリがどう違うのかを比較してみる。

(どうでもいいけど、アセンブラアセンブリの違いがわからない。。。)

 

試してみた結果、volatile有りだと演算用のレジスタ(?)にコピーしてから、加算や比較処理を行うようになっている模様。細かいことはアセンブラが読めないのでわかりません。

[shin@cent6-5 volatile]$ cat loop.c
int
main()
{
  int i;
  for(i=0; i<1000000000; i++){}
}
[shin@cent6-5 volatile]$ 
[shin@cent6-5 volatile]$ cat loop_vol.c
int
main()
{
  volatile int i;
  for(i=0; i<1000000000; i++){}
}
[shin@cent6-5 volatile]$ 
[shin@cent6-5 volatile]$ 
[shin@cent6-5 volatile]$ diff loop.s loop_vol.s
1c1
< 	.file	"loop.c"
---
> 	.file	"loop_vol.c"
16c16,18
< 	addl	$1, -4(%rbp)
---
> 	movl	-4(%rbp), %eax
> 	addl	$1, %eax
> 	movl	%eax, -4(%rbp)
18c20,21
< 	cmpl	$999999999, -4(%rbp)
---
> 	movl	-4(%rbp), %eax
> 	cmpl	$999999999, %eax
[shin@cent6-5 volatile]$ 
[shin@cent6-5 volatile]$ 
[shin@cent6-5 volatile]$ cat loop.s
	.file	"loop.c"
	.text
.globl main
	.type	main, @function
main:
.LFB0:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	movl	$0, -4(%rbp)      ★変数i(rbp)を0で初期化
	jmp	.L2             ★L2にジャンプ
.L3:
	addl	$1, -4(%rbp)      ★変数i(rbp)に1を加算
.L2:
	cmpl	$999999999, -4(%rbp)  ★ループの条件判定
	jle	.L3             ★判定結果に基づきL3にジャンプ
	leave
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE0:
	.size	main, .-main
	.ident	"GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-4)"
	.section	.note.GNU-stack,"",@progbits
[shin@cent6-5 volatile]$ 
[shin@cent6-5 volatile]$ 
[shin@cent6-5 volatile]$ cat loop_vol.s
	.file	"loop_vol.c"
	.text
.globl main
	.type	main, @function
main:
.LFB0:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	movl	$0, -4(%rbp)
	jmp	.L2
.L3:
	movl	-4(%rbp), %eax     ★別のレジスタにコピー
	addl	$1, %eax
	movl	%eax, -4(%rbp)     ★元のレジスタに書き戻し
.L2:
	movl	-4(%rbp), %eax     ★別のレジスタにコピー
	cmpl	$999999999, %eax
	jle	.L3
	leave
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE0:
	.size	main, .-main
	.ident	"GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-4)"
	.section	.note.GNU-stack,"",@progbits
[shin@cent6-5 volatile]$ 

参考にさせて頂いたサイト

X86アセンブラ/GASでの文法 - Wikibooks

アドレッシングモード - Wikipedia

プログラミングノート - x86

「組み込み」ならではの基礎知識