一番シンプルな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番地に飛んで、そこで割り込み禁止して無限ループに入る。
というプログラムになるようだ。



2024.02.13 18:57 | pmlink.png 固定リンク | folder.png その他・雑談

- CafeLog -