FromNandの日記

自分的備忘録

2020-02-01から1ヶ月間の記事一覧

C言語プログラムの中でセクションを作成する方法

次のようにすると、sint32型のiという変数が.testセクションに配置される。 sint32 __attribute__ ((section (".test"))) i; リンカスクリプトで実際に.dataセグメントに配置してみる。 .data VMAのアドレス : AT (LMAのアドレス) { _stest = .; *(.test) _e…

アンペールの法則・レンツの法則・フレミングの右手・左手の法則について

これらの関係がごっちゃになっていたので、一回整理します。アンペールの法則(右ねじの法則)は電流を流すと、電流の方向を右ネジの進む方向として、右ネジの回る向きに磁場が生じること。 レンツの法則の逆のイメージが有る。レンツの法則(電磁誘導)は、コイ…

【USBブートバージョン】自作OS「GAFF」のメモリマップ

「http://softwaretechnique.jp/OS_Development/kernel_loader1.html」は参考になる。 0x00000000-0x000003ff 割り込みベクタテーブル。低位にcs、高位にip(2*2=4byte)が最大256個保存される。 0x00000400-0x000004ff BIOSデータらしい。 0x00000500-0x00007…

x86アセンブリのLEA命令って結局何をするの?

x86にはアドレスを取得する命令として「LEA」というものが存在する。 例えば「leal 4(%esp), %eax」とすると、eaxにesp+4の値が入る。 これなら「movl %esp, %eax」「addl $4, %eax」としたらいいじゃないかと思われると思うが、実はLEA命令はフラグに影響を…

ファームウェアについて

「RAMとROM パソコン初心者講座」によると、半導体で作られたメモリに関していえば、「RAMは電源を切ったときにデータを保持しないメモリ」「ROMは電源を切ってもデータを保持するメモリ」と分けられるようです。 ROMはReadOnlyMemoryという名前ですが、現在…

【C言語】配列にアクセスするコードをアセンブラレベルで覗いてみる

プリミティブなデータ型の一次配列の初期化・代入・参照を確認する #include<stdio.h> int main(void){ int array[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; array[1] = 5; printf("%d\n", array[8]); return 0; } このコードを逆アセンブルすると次のようになる。 内</stdio.h>…

「char array[10];」に対して、式中での「array」「&array」の違いについて

昔、初心者書籍で嘘が書かれていたことがあったのでまとめておきます。 タイトルの通り、「char array[10];」に対しての「array」と「&array」の意味するものは全く異なります。 結論から言ってしまうと、「arrayはchar*」で「&arrayはchar(*)[10]」という意…

【main関数の前の世界】スタートアップ関数を自作してみた!

はじめに main関数の前にはスタートアップ関数という物があり、スタートアップ関数ではアプリケーションの実行のための準備がされている。 かといって、スタートアップ関数は特別なプログラムではなく、実際にアプリケーションプログラマが自作することも可…

構造体をポインタ渡し・値渡し・ポインタ返し・値返しする場合のアセンブラ出力について

ポインタ渡しとポインタ返しについては、普通の配列などと同様のコードが生成される。値渡しについては、引数の部分に構造体のサイズ分のメモリが大胆に確保される。 つまり、4byteの変数と200byteのサイズの構造体を値渡しする場合、引数のサイズはなんと20…

戻り値がvoid型である関数で「return;」を書いた場合と書かない場合の違いについて

さて、前回の「main関数の「return 0;」について逆アセンブルして考察してみた - FromNandの日記」に続いて、今回はタイトルの通りの実験を行います。 まずは、「return;」を書いた場合のソースはこちらになります。 void func(void){ return; } このプログ…

main関数の「return 0;」について逆アセンブルして考察してみた

main関数の「return 0;」は、OSにプログラムが安全に終了したことを伝えるという意味合いを持つ。 しかし実際には、main関数の「return 0;」を書いていない人もしばしば見かける。 ということで、今回は「return 0;」を書くのと書かないのとではどのような違…

標準出力(stdout)と標準エラー出力(stderr)の違いについて

標準出力(stdout)と標準エラー出力(stderr)の違いについてまとめていく。 標準出力と標準エラー出力の主な違いはリダイレクトできるかできないかの違いが大きいらしい。 標準出力はリダイレクトが行われるが、標準エラー出力の方では普通はリダイレクトが行…