デジタルちんぶろぐ

デジタルな話題

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  268  : 記事  0  : コメント  4383  : トラックバック  79

ニュース


技術以外は
ちんぶろぐ

記事カテゴリ

書庫

日記カテゴリ

昨日は喜びのあまりメインと実行結果写真だけでしたが、今日はメインに行くまでを。

スタートアップとローダスクリプトはここを参考にさせていただきました。

 

アセンブラのスタートアップ

; H8/3052 Startup for GCC

    .h8300h

; ベクタ設定。割込は未使用なのでリセットのみ(手抜)
    .section .vector
    .data.l _start

    .section .text
    .global _start
_start:
    mov.l   #__stack,sp

; 初期値付データをROMからRAMへコピー
    mov.l   #___init_data_top,er0
    mov.l   #___data_top,er1
1:
    mov.b   @er0,r2l
    mov.b   r2l,@er1
    adds    #1,er0
    adds    #1,er1
    cmp.l   #___data_end,er1
    blo 1b

; 初期値なしデータ・BSSセクションを0でクリア。
    mov.l   #0,er0
    mov.l   #___bss_top,er1
1:
    mov.b   r0l,@er1
    adds    #1,er1
    cmp.l   #___bss_end,er1
    blo 1b

; Cのmainへ

    jsr @_main

1:

    bra 1b

    .section .stack
    .global __stack
__stack:
 

 

ローダスクリプト

OUTPUT_FORMAT("coff-h8300")
OUTPUT_ARCH(h8300h)
ENTRY("_start")

MEMORY {
    vector(r):      o = 0x00000000, l = 0x00000100
    rom(rx):        o = 0x00000100, l = 0x0007ff00
    ram(rwx):       o = 0x00ffdf10, l = 0x00002000
    exram(rwx):     o = 0x00220000, l = 0x00020000
}

SECTIONS {
    .vector : {
        *(.vector)
    } > vector
    .text : {
        *(.text)
        *(.rodata)
        ___init_data_top = .;
    } > rom

    .data  : AT(___init_data_top) {
        ___data_top = .;
        *(.data)
        ___data_end = .;
    } > ram

    .bss  ALIGN(0x10) : {
        ___bss_top = .;
        *(.bss)
        *(COMMON)
        ___bss_end = .;
    } > ram

    .stack 0x00ffff10 : {
        *(.stack)
    }
}

 

簡単に説明すると、電源ONでCPUはベクタテーブルの先頭(0番地)からPCの値を読み込んで

そこから実行を開始します。このスタートアップだと_startのところです。

_startでは、スタックの設定をした後静的変数の初期化を行いCのmainを呼び出します。

mainから返ってくることは想定していませんが、返ってきちゃったら永久ループです。

尚、スタートアップ・ローダスクリプトともに極力短く書くようにしました。正直なところスタート

アップの静的変数初期化はいらないだろうと思ったんですが、mainに来るまでにはこんなこと

が行われてますよってのがわかるのもいいかなと。

でも、このスタートアップではライブラリの初期化を行っていないのでCの標準ライブラリは

使えません(初期化が必要ないものは利用可能と思われますが)。

投稿日時 : 2008年1月9日 0:17

コメント

# re: 昨日のスタートアップ 2008/01/09 8:34 774RR
1byte 単位で処理するの?処理時間がもったいなーい。
section alignment を確認のうえで mov.w か mov.l で処理しようよ。


# re: 昨日のスタートアップ 2008/01/09 8:48 スーパーあんどちん
ご指摘の通りですね。
セクションでアライン指定して4バイト単位で転送とフィルした方がよいです。


# 初スピーカーを終えて 2008/07/29 0:54 The beast of halfpace
初スピーカーを終えて

# 初スピーカーを終えて 2008/07/29 0:58 The beast of halfpace
初スピーカーを終えて

# jIxqVTKutLIR 2011/12/22 20:08 http://www.discreetpharmacist.com/
t2LdOl Author, keep doing in the same way..!

# BIAGPnCkkR 2011/12/27 19:17 http://www.greetingbee.com/
The Author is crazy..!

# XpPulHxLearQUHu 2011/12/29 20:36 http://www.healthinter.org/health/page/provera.php
I`m so grateful that you enlightened me and the most important thing that it happened in time. Just think, I have been using the internet for six years already but it`s the first time I`ve ever heard about it!...

Post Feedback

タイトル
名前
Url:
コメント: