一番シンプルなC言語のプログラムのアセンブリ言語変換
Microchip studioでC言語のプログラムを作成して、ビルドでできた .lss ファイルを見るといろいろ長い。
new -project で gcc c executable project で新規プロジェクトを作成するとシンプルなコードができる。
#include
int main(void)
{
/* Replace with your application code */
while (1)
{
}
}
不要なものを入れたくないので、 #include コメント化
これでビルドしてできたHEXは、
:100000000C9434000C943E000C943E000C943E0082
:100010000C943E000C943E000C943E000C943E0068
:100020000C943E000C943E000C943E000C943E0058
:100030000C943E000C943E000C943E000C943E0048
:100040000C943E000C943E000C943E000C943E0038
:100050000C943E000C943E000C943E000C943E0028
:100060000C943E000C943E0011241FBECFEFD8E04C
:10007000DEBFCDBF0E9440000C9441000C940000F4
:06008000FFCFF894FFCF52
:00000001FF
.lssの一部を抜き出してみると...
Disassembly of section .text:
00000000 <__vectors>:
0: 0c 94 34 00 jmp 0x68 ; 0x68 <__ctors_end>
4: 0c 94 3e 00 jmp 0x7c ; 0x7c <__bad_interrupt>
8: 0c 94 3e 00 jmp 0x7c ; 0x7c <__bad_interrupt>
-途中省略ー
64: 0c 94 3e 00 jmp 0x7c ; 0x7c <__bad_interrupt>
00000068 <__ctors_end>:
68: 11 24 eor r1, r1
6a: 1f be out 0x3f, r1 ; 63
6c: cf ef ldi r28, 0xFF ; 255
6e: d8 e0 ldi r29, 0x08 ; 8
70: de bf out 0x3e, r29 ; 62
72: cd bf out 0x3d, r28 ; 61
74: 0e 94 40 00 call 0x80 ; 0x80
78: 0c 94 41 00 jmp 0x82 ; 0x82 <_exit>
0000007c <__bad_interrupt>:
7c: 0c 94 00 00 jmp 0 ; 0x0 <__vectors>
00000080:
// #include
int main(void)
{
80: ff cf rjmp .-2 ; 0x80
00000082 <_exit>:
82: f8 94 cli
00000084 <__stop_program>:
84: ff cf rjmp .-2 ; 0x84 <__stop_program>
というわけで、これが最低限のCコンパイラで生成されるアセンブリ言語のようだ。
0番地から68番地に飛んで、なんか省略できない設定をして、
80番地をコールして、80番地で無限ループに入る。
リターンは無いけど、もしリターンがあっても、82番地に飛んで、そこで割り込み禁止して無限ループに入る。
というプログラムになるようだ。
new -project で gcc c executable project で新規プロジェクトを作成するとシンプルなコードができる。
#include
int main(void)
{
/* Replace with your application code */
while (1)
{
}
}
不要なものを入れたくないので、 #include コメント化
これでビルドしてできたHEXは、
:100000000C9434000C943E000C943E000C943E0082
:100010000C943E000C943E000C943E000C943E0068
:100020000C943E000C943E000C943E000C943E0058
:100030000C943E000C943E000C943E000C943E0048
:100040000C943E000C943E000C943E000C943E0038
:100050000C943E000C943E000C943E000C943E0028
:100060000C943E000C943E0011241FBECFEFD8E04C
:10007000DEBFCDBF0E9440000C9441000C940000F4
:06008000FFCFF894FFCF52
:00000001FF
.lssの一部を抜き出してみると...
Disassembly of section .text:
00000000 <__vectors>:
0: 0c 94 34 00 jmp 0x68 ; 0x68 <__ctors_end>
4: 0c 94 3e 00 jmp 0x7c ; 0x7c <__bad_interrupt>
8: 0c 94 3e 00 jmp 0x7c ; 0x7c <__bad_interrupt>
-途中省略ー
64: 0c 94 3e 00 jmp 0x7c ; 0x7c <__bad_interrupt>
00000068 <__ctors_end>:
68: 11 24 eor r1, r1
6a: 1f be out 0x3f, r1 ; 63
6c: cf ef ldi r28, 0xFF ; 255
6e: d8 e0 ldi r29, 0x08 ; 8
70: de bf out 0x3e, r29 ; 62
72: cd bf out 0x3d, r28 ; 61
74: 0e 94 40 00 call 0x80 ; 0x80
78: 0c 94 41 00 jmp 0x82 ; 0x82 <_exit>
0000007c <__bad_interrupt>:
7c: 0c 94 00 00 jmp 0 ; 0x0 <__vectors>
00000080
// #include
int main(void)
{
80: ff cf rjmp .-2 ; 0x80
00000082 <_exit>:
82: f8 94 cli
00000084 <__stop_program>:
84: ff cf rjmp .-2 ; 0x84 <__stop_program>
というわけで、これが最低限のCコンパイラで生成されるアセンブリ言語のようだ。
0番地から68番地に飛んで、なんか省略できない設定をして、
80番地をコールして、80番地で無限ループに入る。
リターンは無いけど、もしリターンがあっても、82番地に飛んで、そこで割り込み禁止して無限ループに入る。
というプログラムになるようだ。
LED電球の分解、その1
x86アセンブラでプログラム
AVR マイコンのアーキテクチャと機械語