Top Page [◀◀] 2 3 4 5 6 7 8 9 ... [▶▶] Last Page
いつもお世話になっております。
[環境] e2studio RZ/A1L (R7S721021)
[質問]
以下のプログラムがあるとき 変数v2への初期値を置くオブジェクトが出ません。 (初期値0以外の変数にはオブジェクトが作られます。)
これは、その変数に割り当てられたメモリーの初期値が0であることを考慮し その上へオブジェクトを置くために初期値をコピーする必要がないと解釈しているせいだと思います。
初期値0に対するオブジェクトを作り出すオプションはあるでしょうか?
[Cソース]
int v1 = 0x12345678;
int v2 = 0;
int v3 = 1;
int v4 = 0x87654321;
sum( int s )
{
return( s+v1+v2+v3+v4);
}
[アセンブラソース 初期値部分]
0000 78563412 .word 305419896 25 .global v2 26 .bss 27 .align 2 30 v2: 31 0000 00000000 .space 4 <<<<<< 初期値が作られない 32 .global v3 33 .data 34 .align 2 37 v3: 38 0004 01000000 .word 1 39 .global v4 40 .align 2 43 v4: 44 0008 21436587 .word -2023406815 45 .text 46 .align 2 47 .global sum
In reply to わわい:
In reply to にもち:
In reply to リカルド:
In reply to fujita nozomu:
>初期値無しの変数(BSS領域)は、 起動時all 0で動きだすという暗黙の了解があるようですね。
特に指定しない変数をゼロにするのは暗黙ではなくANSI規格に明確に記載されていたと記憶してます。(チョットインターネットで検索したのですが情報が見つからず再確認できませんでした。)
In reply to kijo:
In reply to Hos:
C言語の多くの教科書にコンパイラそのものはファンクションの入出力程度の機能に抑えてほとんどをライブラリでカバーすると書かれてます。例えば、PASCALのWRITEはコンパイラで対応しますが、Cの場合はprintfを呼び出すことで実現してます。出力装置が変わってもコンパイラをそのままでprintfファンクションを書き換えるだけで対応が可能で、移植性の良さのメリットとされてます。C言語の場合はライブラリなどもコンパイラの一部と考えアプリケーション開発者はあらかじめ用意されているコードの書き換えを控えないとせっかくの移植性や検証性のメリットが失われます。