狠狠撸

狠狠撸Share a Scribd company logo
12ステップで作る组込み翱厂自作入门
      4thステップ




                @sandai
【参考書籍】
12ステップで作る组込み翱厂自作入门
【内容】
1ステップずつ、実際に動かしながらプログラムを発展さ
せていく方式で無理なく学べる。OSやハードウェアに詳
しくない方にも理解できるよう
に十分な説明を提供

坂井 弘亮(著)
カットシステム(2010/5)

【税込価格】
4,410円

【サポートページ】
http://kozos.jp/books/makeos/
もくじ
1.ブートローダ
2.齿惭翱顿贰惭の実装とプログラム実行
3.まとめ
4.アセンブリ言语
1.ブートローダ
フラッシュROMの書き込み回数
●   フラッシュROMの書き込み回数には制限がある
    –   H8/3069Fでは最悪100回(通常の利用の範囲なら1000
        回)
●   これから開発を進めていく上で上限に達してし
    まうので、フラッシュROMに直接書き込む代わ
    りにOSをシリアル経由でダウンロードして、そ
    れをRAMに展開して起動するプログラムをフ
    ラッシュROMに書き込む方法を取る
●   このプログラムをブートローダと呼ぶ
    – IPLもブートローダと同じ意味合いかな
ブートローダ
●   電源ONでまずブートローダを起動させ、それか
    らOSをダウンロードし、OSを起動させる
●   こうして段階を踏んでOSを起動する手順を一般
    的にブートストラップと呼ぶ
●   これでOSを修正する度にフラッシュROMに書き
    込まずにすむ
    –   これは開発段階の話で、実際なら製品化のときにフ
        ラッシュROMに直接書き込んで普通にROMから起動さ
        せることが多い(ROM化と言う)
        ● ROM化の方法が紹介されているが今回はROM化し

          ないので省略
シリアル経由でファイル転送
●   今回作成するブートローダは次の3つの機能が
    必要となる
    –   シリアル経由でOSをダウンロードし、RAM上にいっ
        たん保存する
    –   保存したOSを適切にRAM上に展開
    –   RAM上に展開したOSを実行
シリアル経由でのダウンロード
●   今まではkzloadというファイルをフラッシュ
    ROMに直接書き込んでいたけど、これがシリア
    ル経由でマイコンに転送する方法に変わる
●   そこで利用するプロトコルがXMODEMというプロ
    トコル
    –   昔からあるシリアル経由でのファイル転送のプロト
        コルで、仕様が簡単なので実装の手間もかからない
    –   ただし、転送効率は悪いし、信頼性も低い
    –   今回はそういったことはシビアに考える必要はない
        ので、問題はないとのこと
XMODEMの仕様(送信側)
●   ①受信側から定期的に送信されるNAK(ox15)を受けた
    ら送信を開始
●   ②データはブロック単位に分けて送信する。ブロック
    は固定長なので、ファイルの終端なおでデータ量が足
    りない場合にはEOF(x01a)で埋める
●   ③1ブロック送信したらACK(0x06)かNAKが返ってくる
    のを待つ。ACKの場合には、引き続き次のブロックを
    送信。NAKの場合には同じブロックを転送
●   ④データの終わりはEOT(0x04)を送信し、ACKが返って
    きたら終了
●   ⑤中断したい場合はCAN(0x18)を送信する。CANを受け
    たら中断
XMODEMの仕様(受信側)
●   ①受信準備ができたら合図として定期的にNAKを送
    信。シリアルから文字を受信したらデータ受信開始
●   ②SOH(0x01)を受けたら連続するデータをブロックと
    して受信。受信に成功したらACKを返す。失敗したら
    (チェックサムエラーなど)NAKを返す
●   ③EOTを受けたらACKをかえして終了
●   ④中断したい場合はCANを送信。CANを受けたら中断
ブロックのフォーマット
●   送信するブロックのフォーマットは以下の通り

    a       b    c                d                e
127頁 図4.1 XMODEMのブロック?フォーマット より


フィールド サイズ              意味

        a       1バイト   SOH

        b       1バイト   ブロック番号。1からの通番で、255の次は0になる

        c       1バイト   ブロック番号をビット反転したもの(チェック用)

        d       128バイト データ。データが128バイトに満たない場合はEOFで埋める

        e       1バイト   データ部のチェックサム

128頁 表4.1 各フィールドの意味 より
ACKとNAK
●   ACK(ACKnowledge)
    –   受信成功時の応答として送信されるコード
●   NAK(NegativeAcKnowledge)
    –   エラー時の応答として送信されるコード
2.齿惭翱顿贰惭の実装とプログラム実行
プログラムの修正とファイル追加
●   追加ファイル
    – xmodem.h、xmodem.c...XMODEMプロトコル実装
●   修正ファイル
    – main.c...コマンド動作を実装
    – id.scr...bufferセクションを追加
    – serial.h、serial.c...文字の受信を実装
    – lib.h、lib.c...文字列受信用のライブラリ関数追加
    – Makefile
XMODEM実装
●   xmodem.cは受信用の処理を行なっている
    –   送信はlrzszのlsxというアプリを使うみたい(cuコ
        マンドだと)
●   仕様についてはスライド9pを参照
ld.scr
●   ダウンロードしたファイルを配置する場所を定
    義している
    –   これは#defineでヘッダファイルに書くことが多い
        が、今回はリンカ?スクリプトをメモリマップとし
        て扱うためリンカ?スクリプトに書く
buffer(rwx) : o = 0xffdf20, l = 0x001d00

~~~~~~~~~~~

.rodata {
} > rom

.buffer : {
        _buffer_start = . ;
} > buffer
その他修正コード
●   serial.cは受信用の関数を追加
●   lib.cも受信用のライブラリ関数を追加
●   Mekefileはxmodem.oをコンパイル対象にしただ
    け
lrzszインストール
●   MacでXMODEMプロトコルによる転送を行う場
    合、lrzszをインストールする必要がある
●   最も簡単な方法はhomebrewからインストールす
    ること
●   homebrewが何か分からない場合は検索して
●   インストール方法はターミナルから下記のよう
    に入力するだけ
$ brew install lrzsz
lsxの使い方
●   lrzszのうち、lsxというXMODEMプロトコルの転
    送アプリを使って転送を行う
●   書籍では~CLocal command? lsx defines.hみた
    いに入力しろとあるが、Macではうまくいかな
    い
●   ~+lsx defines.hとするように注意すること
     – なるべく早く~+と打つ
プログラム実行(load)
/Users/sandai/12step/src/04/bootload% sudo cu -l
/dev/tty.usbserial-FTG6PQ4H
Password:
Connected.
kzload (kozos boot loader) started.
kzload> load
~+lsx defines.h
Sending defines.h, 1 blocks: Give your local XMODEM receive
command now.
Bytes Sent:     256  BPS:65

Transfer complete

XMODEM receive succeeded!
プログラム実行(dump)
/Users/sandai/12step/src/04/bootload% sudo cu -l
/dev/tty.usbserial-FTG6PQ4H
.
.
.
Transfer complete

XMODEM receive   succeeded!
kzload> dump
size: 100
23 69 66 6e 64   65   66   20   5f   44   45   46   49   4e   45   53
5f 48 5f 49 4e   43   4c   55   44   45   44   5f   0a   23   64   65
66 69 6e 65 20   5f   44   45   46   49   4e   45   53   5f   48   5f
49 4e 43 4c 55   44   45   44   5f   0a   0a   23   64   65   66   69
6e 65 20 4e 55   4c   4c   20   28   28   76   6f   69   64   20   2a
.
.
dumpの確認
●   dumpコマンドを使うと前のページのように転送
    したファイルが16進数で表示される
●   実際にうまく転送できているかどうか、オリジ
    ナルのdefines.hと比較してみるには、ターミ
    ナルで下記のようにコマンド
/Users/sandai/12step/src/04/bootload%   hexdump -C defines.h
00000000 23 69 66 6e 64 65 66 20 5f     44 45 46 49 4e 45 53   |#ifndef _DEFINES|
00000010 5f 48 5f 49 4e 43 4c 55 44     45 44 5f 0a 23 64 65   |_H_INCLUDED_.#de|
00000020 66 69 6e 65 20 5f 44 45 46     49 4e 45 53 5f 48 5f   |fine _DEFINES_H_|
00000030 49 4e 43 4c 55 44 45 44 5f     0a 0a 23 64 65 66 69   |INCLUDED_..#defi|
00000040 6e 65 20 4e 55 4c 4c 20 28     28 76 6f 69 64 20 2a   |ne NULL ((void *|
.
.
.
3.まとめ
まとめ
●   XMODEMプロトコルを実装してファイル転送を
    行った
●   特に複雑な概念や用語は出て来なかったので、
    気楽にできる
    –   ただまあXMODEMの実装がちょっとあれ。送信側の
        コードがないからはっきりイメージはできない。と
        はいえ、単純なプロトコルで分かりやすいといえば
        分かりやすい
●   ~+lsxの部分は、Macであれば書籍の通りではう
    まくいかないので気をつける
4.アセンブリ言语
アセンブラ?プログラミング
●   OSを自作する場合アセンブラの知識が必須
●   アセンブラでないと記述できない部分があるか
    ら(アセンブラで書くべき部分)
    –   スタートアップ
    –   割込みの入力と出口
    –   スレッドのディスパッチ
●   全部の命令を覚える必要はない
●   やりたいことだけできるようになれば十分
スタック
●   たとえばforで使うカウンタ変数をずっとメモ
    リ上に置いとくのは邪魔で無駄
●   そこで自動変数みたいなのがある
    –   関数に入ったときに獲得され、関数から出たら捨て
        られるやつ
●   でまあこういった扱いをするためにスタックを
    使う
    –   スタックを管理するために利用されるポインタをス
        タック?ポインタ
    –   関数単位でスタック上に確保される領域をスタッ
        ク?フレーム
自動変数のスタックは意識しない
●   スタック?ポインタやスタック?フレームの詳
    細は検索で適当に調べると良い
●   C言語でプログラムを書く場合は、普通はこん
    なことは意識しない
●   C言語側でいろいろ調節してくれる
    –   というかコンパイラだろうね
アセンブリ言語について
●   CPUはメモリ上にある機械語命令を逐次実行し
    ていく
●   しかしメモリ上には数値しか保存できない
●   だから、アセンブリ言語の命令ってのは数値の
    こと
    –   ただし数値だと人間は扱いにくいので、ニーモニッ
        クでコードを書く
        ● ニーモニックは普通に文字打ってプログラミン

          グできるようにしたもの
        ● とはいえ、命令はアセンブラで数値に変換され

          る。数値というか実行形式ね
CPUのレジスタ
●   CPU内部にある記憶領域
    –   汎用OSに慣れている者からすれば、周辺機器の持つ
        レジスタよりこっちの方が一般的
●   CPUは加算や減算などの数値計算を行うための
    回路を持っているが、これらの回路の入力や出
    力はレジスタに接続されている
    –   つまりレジスタを経由して行われるってことね
    –   だからメモリ上のデータはこのレジスタに読み込ん
        でから処理が行われる
ロードとストア
●   メモリ上の値をレジスタに読み込むことをロー
    ドと呼ぶ
●   レジスタの値をメモリ上に書き込むことをスト
    アと呼ぶ
●   メモリ上のデータのロードやストア、演算など
    汎用的に利用されるレジスタを汎用レジスタと
    呼ぶ
    –   どのレジスタをどう使うかってのがよくわからんが
        なあ
プログラム?カウンタ(PC)
●   汎用レジスタとは別の重要なレジスタでプログ
    ラム?カウンタがある
    –   CPUが現在実行中の命令のアドレスを指す
         ● 実行中というか次のアドレス


●   CPUはPCを加算しつつPCの指すメモリ先の命令
    を逐次実行しながら処理を進めていくわけ
    –   PCは次の命令を指す位置まで自動で加算される
●   PCの役割ってのはいわゆるジャンプ命令
    –   C言語でいうところのgoto
    –   ジャンプ命令はPCへの値の代入にすぎない
オペコードとオペランド
●   アセンブリの命令を表す部分をオペコードと呼
    ぶ。命令に対する引数に相当する部分をオペラ
    ンドと呼ぶ
●   こういったものを人間がわかりやすいようにし
    たのがニーモニック
オペコード
↓ オペランド
↓      ↓
ld r1, 0x8000    ←   実際ldってのは0x01みたいな数値
ld r2, 0x8004    ←   だけどそれじゃあわかりにくい
add r3, r1, r2   ←   そこでldとかaddとか文字を使う
st r3, 0x8010    ←   こういう表現をニーモニックと呼ぶ
インストラクション
●   機械語の命令はインストラクションとも呼ばれ
    る
    – どの数値がどの命令として動作するかという
      気もありを、命令セットとかインストラク
      ション?セットという
●   命令セットはCPUごとに違う
    – H8とx86じゃやっぱり違うらしい
    – 見た限りでは結構似ている
    – 命令じゃないけどレジスタ名は違うな
アセンブル、アセンブラ
●   アセンブリ言語で書いたコードを機械語コード
    のバイト列に変換する作業をアセンブルと言う
    –   昔は手でやってたからハンド?アセンブルなんて言
        葉も残ってる
●   アセンブルを行うプログラムをアセンブラと呼
    ぶ
    –   コンパイラみたいな位置づけで考えればイメージし
        やすい
●   機械語コードをアセンブラに逆変換することを
    逆アセンブルと呼ぶ
おわり
●   このあと実行形式ファイルを逆アセンブルして
    いろいろ解説されているが、かなり長くなるの
    でここで終わる
●   汎用OSであればアセンブリ周りはGASやNASMで
    やればいいと思うのでこのあたりは流してもい
    いんじゃないかな
●   でも勉強になるっちゃなる
Ad

More Related Content

What's hot (20)

Stack pivot
Stack pivotStack pivot
Stack pivot
sounakano
?
ダブル配列の豆知识
ダブル配列の豆知识ダブル配列の豆知识
ダブル配列の豆知识
s5yata
?
Divisor
DivisorDivisor
Divisor
oupc
?
ISUCON4 予選問題で(中略)、”my.cnf”に1行だけ足して予選通過ラインを突破するの術
ISUCON4 予選問題で(中略)、”my.cnf”に1行だけ足して予選通過ラインを突破するの術ISUCON4 予選問題で(中略)、”my.cnf”に1行だけ足して予選通過ラインを突破するの術
ISUCON4 予選問題で(中略)、”my.cnf”に1行だけ足して予選通過ラインを突破するの術
Masahiro Nagano
?
CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料
SECCON Beginners
?
Tokyo r94 beginnerssession3
Tokyo r94 beginnerssession3Tokyo r94 beginnerssession3
Tokyo r94 beginnerssession3
kotora_0507
?
文字列検索のいろいろ
文字列検索のいろいろ文字列検索のいろいろ
文字列検索のいろいろ
Kazuma Mikami
?
Alpine linuxを触ってみよう
Alpine linuxを触ってみようAlpine linuxを触ってみよう
Alpine linuxを触ってみよう
Ryo Adachi
?
计算量のはなし(搁别诲颈蝉を使うなら必読!翱(濒辞驳狈)など)
计算量のはなし(搁别诲颈蝉を使うなら必読!翱(濒辞驳狈)など)计算量のはなし(搁别诲颈蝉を使うなら必読!翱(濒辞驳狈)など)
计算量のはなし(搁别诲颈蝉を使うなら必読!翱(濒辞驳狈)など)
Makoto SAKAI
?
驳驳辫濒辞迟2をつかってみよう
驳驳辫濒辞迟2をつかってみよう驳驳辫濒辞迟2をつかってみよう
驳驳辫濒辞迟2をつかってみよう
Hiroki It?
?
【学习メモ#7迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#7迟丑】12ステップで作る组込み翱厂自作入门 【学习メモ#7迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#7迟丑】12ステップで作る组込み翱厂自作入门
sandai
?
并行処理初心者のための础办办补入门
并行処理初心者のための础办办补入门并行処理初心者のための础办办补入门
并行処理初心者のための础办办补入门
Yoshimura Soichiro
?
Raft
RaftRaft
Raft
Preferred Networks
?
【学习メモ#8迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#8迟丑】12ステップで作る组込み翱厂自作入门 【学习メモ#8迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#8迟丑】12ステップで作る组込み翱厂自作入门
sandai
?
Linux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledgeLinux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledge
Angel Boy
?
竞技フ?ロク?ラミンク?におけるコート?の书き方とその利便性
竞技フ?ロク?ラミンク?におけるコート?の书き方とその利便性竞技フ?ロク?ラミンク?におけるコート?の书き方とその利便性
竞技フ?ロク?ラミンク?におけるコート?の书き方とその利便性
Hibiki Yamashiro
?
CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料
SECCON Beginners
?
DeNAtechcon_DeNAのセキュリティの取り組みと、スマートフォンセキュリティ(same-origin policy)
DeNAtechcon_DeNAのセキュリティの取り組みと、スマートフォンセキュリティ(same-origin policy)DeNAtechcon_DeNAのセキュリティの取り組みと、スマートフォンセキュリティ(same-origin policy)
DeNAtechcon_DeNAのセキュリティの取り組みと、スマートフォンセキュリティ(same-origin policy)
Toshiharu Sugiyama
?
ダブル配列の豆知识
ダブル配列の豆知识ダブル配列の豆知识
ダブル配列の豆知识
s5yata
?
Divisor
DivisorDivisor
Divisor
oupc
?
ISUCON4 予選問題で(中略)、”my.cnf”に1行だけ足して予選通過ラインを突破するの術
ISUCON4 予選問題で(中略)、”my.cnf”に1行だけ足して予選通過ラインを突破するの術ISUCON4 予選問題で(中略)、”my.cnf”に1行だけ足して予選通過ラインを突破するの術
ISUCON4 予選問題で(中略)、”my.cnf”に1行だけ足して予選通過ラインを突破するの術
Masahiro Nagano
?
CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料CTF for ビギナーズ バイナリ講習資料
CTF for ビギナーズ バイナリ講習資料
SECCON Beginners
?
Tokyo r94 beginnerssession3
Tokyo r94 beginnerssession3Tokyo r94 beginnerssession3
Tokyo r94 beginnerssession3
kotora_0507
?
文字列検索のいろいろ
文字列検索のいろいろ文字列検索のいろいろ
文字列検索のいろいろ
Kazuma Mikami
?
Alpine linuxを触ってみよう
Alpine linuxを触ってみようAlpine linuxを触ってみよう
Alpine linuxを触ってみよう
Ryo Adachi
?
计算量のはなし(搁别诲颈蝉を使うなら必読!翱(濒辞驳狈)など)
计算量のはなし(搁别诲颈蝉を使うなら必読!翱(濒辞驳狈)など)计算量のはなし(搁别诲颈蝉を使うなら必読!翱(濒辞驳狈)など)
计算量のはなし(搁别诲颈蝉を使うなら必読!翱(濒辞驳狈)など)
Makoto SAKAI
?
驳驳辫濒辞迟2をつかってみよう
驳驳辫濒辞迟2をつかってみよう驳驳辫濒辞迟2をつかってみよう
驳驳辫濒辞迟2をつかってみよう
Hiroki It?
?
【学习メモ#7迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#7迟丑】12ステップで作る组込み翱厂自作入门 【学习メモ#7迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#7迟丑】12ステップで作る组込み翱厂自作入门
sandai
?
并行処理初心者のための础办办补入门
并行処理初心者のための础办办补入门并行処理初心者のための础办办补入门
并行処理初心者のための础办办补入门
Yoshimura Soichiro
?
【学习メモ#8迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#8迟丑】12ステップで作る组込み翱厂自作入门 【学习メモ#8迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#8迟丑】12ステップで作る组込み翱厂自作入门
sandai
?
Linux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledgeLinux binary Exploitation - Basic knowledge
Linux binary Exploitation - Basic knowledge
Angel Boy
?
竞技フ?ロク?ラミンク?におけるコート?の书き方とその利便性
竞技フ?ロク?ラミンク?におけるコート?の书き方とその利便性竞技フ?ロク?ラミンク?におけるコート?の书き方とその利便性
竞技フ?ロク?ラミンク?におけるコート?の书き方とその利便性
Hibiki Yamashiro
?
CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料
SECCON Beginners
?
DeNAtechcon_DeNAのセキュリティの取り組みと、スマートフォンセキュリティ(same-origin policy)
DeNAtechcon_DeNAのセキュリティの取り組みと、スマートフォンセキュリティ(same-origin policy)DeNAtechcon_DeNAのセキュリティの取り組みと、スマートフォンセキュリティ(same-origin policy)
DeNAtechcon_DeNAのセキュリティの取り組みと、スマートフォンセキュリティ(same-origin policy)
Toshiharu Sugiyama
?

Viewers also liked (20)

【学习メモ#5迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#5迟丑】12ステップで作る组込み翱厂自作入门【学习メモ#5迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#5迟丑】12ステップで作る组込み翱厂自作入门
sandai
?
【学习メモ#1蝉迟】12ステップで作る组込み翱厂自作入门
【学习メモ#1蝉迟】12ステップで作る组込み翱厂自作入门【学习メモ#1蝉迟】12ステップで作る组込み翱厂自作入门
【学习メモ#1蝉迟】12ステップで作る组込み翱厂自作入门
sandai
?
RoadAR v.2.3 english
RoadAR v.2.3 englishRoadAR v.2.3 english
RoadAR v.2.3 english
Евгений Никольский
?
【学习メモ#11迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#11迟丑】12ステップで作る组込み翱厂自作入门 【学习メモ#11迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#11迟丑】12ステップで作る组込み翱厂自作入门
sandai
?
【学习メモ#9迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#9迟丑】12ステップで作る组込み翱厂自作入门 【学习メモ#9迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#9迟丑】12ステップで作る组込み翱厂自作入门
sandai
?
【学习メモ#6迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#6迟丑】12ステップで作る组込み翱厂自作入门 【学习メモ#6迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#6迟丑】12ステップで作る组込み翱厂自作入门
sandai
?
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
Kishi Shundo
?
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
Hirotaka Kawata
?
蚕贰惭鲍で础搁惭64产颈迟ベアメタルプログラミング
蚕贰惭鲍で础搁惭64产颈迟ベアメタルプログラミング蚕贰惭鲍で础搁惭64产颈迟ベアメタルプログラミング
蚕贰惭鲍で础搁惭64产颈迟ベアメタルプログラミング
Yuma Ohgami
?
组込み翱厂を作ってみよう!(オープンソースカンファレンス内セミナー资料)
组込み翱厂を作ってみよう!(オープンソースカンファレンス内セミナー资料)组込み翱厂を作ってみよう!(オープンソースカンファレンス内セミナー资料)
组込み翱厂を作ってみよう!(オープンソースカンファレンス内セミナー资料)
kozossakai
?
やってよかった翱厂作り
やってよかった翱厂作りやってよかった翱厂作り
やってよかった翱厂作り
Hidemi Kawai
?
低レイヤー入门
低レイヤー入门低レイヤー入门
低レイヤー入门
demuyan
?
人工知能概論 1
人工知能概論 1人工知能概論 1
人工知能概論 1
Tadahiro Taniguchi
?
ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門
Hirotaka Kawata
?
【2000行弱!】虫86用自作カーネルの绍介
【2000行弱!】虫86用自作カーネルの绍介【2000行弱!】虫86用自作カーネルの绍介
【2000行弱!】虫86用自作カーネルの绍介
Yuma Ohgami
?
Web系だって低レイヤーがやりたいんだよ! コンパイラことはじめ
Web系だって低レイヤーがやりたいんだよ! コンパイラことはじめWeb系だって低レイヤーがやりたいんだよ! コンパイラことはじめ
Web系だって低レイヤーがやりたいんだよ! コンパイラことはじめ
Nisei Kimura
?
颁++でできる!翱厂自作入门
颁++でできる!翱厂自作入门颁++でできる!翱厂自作入门
颁++でできる!翱厂自作入门
uchan_nos
?
颁迟蹿のための辫测迟丑辞苍入门
颁迟蹿のための辫测迟丑辞苍入门颁迟蹿のための辫测迟丑辞苍入门
颁迟蹿のための辫测迟丑辞苍入门
shiracamus
?
ハッキング実演
ハッキング実演ハッキング実演
ハッキング実演
Ken Ogura
?
CTF超入門 (for 第12回セキュリティさくら)
CTF超入門 (for 第12回セキュリティさくら)CTF超入門 (for 第12回セキュリティさくら)
CTF超入門 (for 第12回セキュリティさくら)
kikuchan98
?
【学习メモ#5迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#5迟丑】12ステップで作る组込み翱厂自作入门【学习メモ#5迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#5迟丑】12ステップで作る组込み翱厂自作入门
sandai
?
【学习メモ#1蝉迟】12ステップで作る组込み翱厂自作入门
【学习メモ#1蝉迟】12ステップで作る组込み翱厂自作入门【学习メモ#1蝉迟】12ステップで作る组込み翱厂自作入门
【学习メモ#1蝉迟】12ステップで作る组込み翱厂自作入门
sandai
?
【学习メモ#11迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#11迟丑】12ステップで作る组込み翱厂自作入门 【学习メモ#11迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#11迟丑】12ステップで作る组込み翱厂自作入门
sandai
?
【学习メモ#9迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#9迟丑】12ステップで作る组込み翱厂自作入门 【学习メモ#9迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#9迟丑】12ステップで作る组込み翱厂自作入门
sandai
?
【学习メモ#6迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#6迟丑】12ステップで作る组込み翱厂自作入门 【学习メモ#6迟丑】12ステップで作る组込み翱厂自作入门
【学习メモ#6迟丑】12ステップで作る组込み翱厂自作入门
sandai
?
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
組み込み向けC++のやり方を探る - mbedで楽しい組み込みプログラミング -
Kishi Shundo
?
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
30日でできない!コンピューター自作入門 - カーネル/VM探検隊@つくば
Hirotaka Kawata
?
蚕贰惭鲍で础搁惭64产颈迟ベアメタルプログラミング
蚕贰惭鲍で础搁惭64产颈迟ベアメタルプログラミング蚕贰惭鲍で础搁惭64产颈迟ベアメタルプログラミング
蚕贰惭鲍で础搁惭64产颈迟ベアメタルプログラミング
Yuma Ohgami
?
组込み翱厂を作ってみよう!(オープンソースカンファレンス内セミナー资料)
组込み翱厂を作ってみよう!(オープンソースカンファレンス内セミナー资料)组込み翱厂を作ってみよう!(オープンソースカンファレンス内セミナー资料)
组込み翱厂を作ってみよう!(オープンソースカンファレンス内セミナー资料)
kozossakai
?
やってよかった翱厂作り
やってよかった翱厂作りやってよかった翱厂作り
やってよかった翱厂作り
Hidemi Kawai
?
低レイヤー入门
低レイヤー入门低レイヤー入门
低レイヤー入门
demuyan
?
ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門
Hirotaka Kawata
?
【2000行弱!】虫86用自作カーネルの绍介
【2000行弱!】虫86用自作カーネルの绍介【2000行弱!】虫86用自作カーネルの绍介
【2000行弱!】虫86用自作カーネルの绍介
Yuma Ohgami
?
Web系だって低レイヤーがやりたいんだよ! コンパイラことはじめ
Web系だって低レイヤーがやりたいんだよ! コンパイラことはじめWeb系だって低レイヤーがやりたいんだよ! コンパイラことはじめ
Web系だって低レイヤーがやりたいんだよ! コンパイラことはじめ
Nisei Kimura
?
颁++でできる!翱厂自作入门
颁++でできる!翱厂自作入门颁++でできる!翱厂自作入门
颁++でできる!翱厂自作入门
uchan_nos
?
颁迟蹿のための辫测迟丑辞苍入门
颁迟蹿のための辫测迟丑辞苍入门颁迟蹿のための辫测迟丑辞苍入门
颁迟蹿のための辫测迟丑辞苍入门
shiracamus
?
ハッキング実演
ハッキング実演ハッキング実演
ハッキング実演
Ken Ogura
?
CTF超入門 (for 第12回セキュリティさくら)
CTF超入門 (for 第12回セキュリティさくら)CTF超入門 (for 第12回セキュリティさくら)
CTF超入門 (for 第12回セキュリティさくら)
kikuchan98
?
Ad

Similar to 【学习メモ#4迟丑】12ステップで作る组込み翱厂自作入门 (20)

Tmux
TmuxTmux
Tmux
harutsugu shimoji
?
Tmux
TmuxTmux
Tmux
harutsugu shimoji
?
良いコードとは
良いコードとは良いコードとは
良いコードとは
Nobuyuki Matsui
?
ネットワークコマンド入力に対応したツール事例
ネットワークコマンド入力に対応したツール事例ネットワークコマンド入力に対応したツール事例
ネットワークコマンド入力に対応したツール事例
fumoto kazuhiro
?
もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…
Yasumasa Suenaga
?
大规模ソーシャルゲームを支える技术~笔贬笔+惭测厂蚕尝を使った高负荷対策~
大规模ソーシャルゲームを支える技术~笔贬笔+惭测厂蚕尝を使った高负荷対策~大规模ソーシャルゲームを支える技术~笔贬笔+惭测厂蚕尝を使った高负荷対策~
大规模ソーシャルゲームを支える技术~笔贬笔+惭测厂蚕尝を使った高负荷対策~
infinite_loop
?
罢谤别尘补で试す贵颈谤别飞补濒濒
罢谤别尘补で试す贵颈谤别飞补濒濒罢谤别尘补で试す贵颈谤别飞补濒濒
罢谤别尘补で试す贵颈谤别飞补濒濒
M Hagiwara
?
第1回勉强会スライド
第1回勉强会スライド第1回勉强会スライド
第1回勉强会スライド
koturn 0;
?
RTミドルウェアによるロボットプログラミング技術 2.プログラミングの基礎
RTミドルウェアによるロボットプログラミング技術 2.プログラミングの基礎RTミドルウェアによるロボットプログラミング技術 2.プログラミングの基礎
RTミドルウェアによるロボットプログラミング技術 2.プログラミングの基礎
Noriaki Ando
?
PEZY-SC programming overview
PEZY-SC programming overviewPEZY-SC programming overview
PEZY-SC programming overview
Ryo Sakamoto
?
Bsd suki
Bsd sukiBsd suki
Bsd suki
yamori813
?
OpenSolaris Printing Environment
OpenSolaris Printing EnvironmentOpenSolaris Printing Environment
OpenSolaris Printing Environment
Naruhiko Ogasawara
?
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
Izumi Tsutsui
?
Step-Oriented Programming による任意コード実行の可能性
Step-Oriented Programming による任意コード実行の可能性Step-Oriented Programming による任意コード実行の可能性
Step-Oriented Programming による任意コード実行の可能性
kozossakai
?
Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮
Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮
Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮
CODE BLUE
?
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
Ransui Iso
?
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
Tsukasa Oi
?
尝笔滨颁レベル1技术解説セミナー(2012/11/11)
尝笔滨颁レベル1技术解説セミナー(2012/11/11)尝笔滨颁レベル1技术解説セミナー(2012/11/11)
尝笔滨颁レベル1技术解説セミナー(2012/11/11)
Kazuko Itoda
?
C language Sem 01
C language Sem 01C language Sem 01
C language Sem 01
Kosei Moriyama
?
ネットワークコマンド入力に対応したツール事例
ネットワークコマンド入力に対応したツール事例ネットワークコマンド入力に対応したツール事例
ネットワークコマンド入力に対応したツール事例
fumoto kazuhiro
?
もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…もしも… Javaでヘテロジニアスコアが使えたら…
もしも… Javaでヘテロジニアスコアが使えたら…
Yasumasa Suenaga
?
大规模ソーシャルゲームを支える技术~笔贬笔+惭测厂蚕尝を使った高负荷対策~
大规模ソーシャルゲームを支える技术~笔贬笔+惭测厂蚕尝を使った高负荷対策~大规模ソーシャルゲームを支える技术~笔贬笔+惭测厂蚕尝を使った高负荷対策~
大规模ソーシャルゲームを支える技术~笔贬笔+惭测厂蚕尝を使った高负荷対策~
infinite_loop
?
罢谤别尘补で试す贵颈谤别飞补濒濒
罢谤别尘补で试す贵颈谤别飞补濒濒罢谤别尘补で试す贵颈谤别飞补濒濒
罢谤别尘补で试す贵颈谤别飞补濒濒
M Hagiwara
?
第1回勉强会スライド
第1回勉强会スライド第1回勉强会スライド
第1回勉强会スライド
koturn 0;
?
RTミドルウェアによるロボットプログラミング技術 2.プログラミングの基礎
RTミドルウェアによるロボットプログラミング技術 2.プログラミングの基礎RTミドルウェアによるロボットプログラミング技術 2.プログラミングの基礎
RTミドルウェアによるロボットプログラミング技術 2.プログラミングの基礎
Noriaki Ando
?
PEZY-SC programming overview
PEZY-SC programming overviewPEZY-SC programming overview
PEZY-SC programming overview
Ryo Sakamoto
?
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
NetBSDのクロスビルドのしくみとインストール済みLive Imageの作成
Izumi Tsutsui
?
Step-Oriented Programming による任意コード実行の可能性
Step-Oriented Programming による任意コード実行の可能性Step-Oriented Programming による任意コード実行の可能性
Step-Oriented Programming による任意コード実行の可能性
kozossakai
?
Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮
Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮
Step-Oriented Programming による任意コード実行の可能性 by 坂井 弘亮
CODE BLUE
?
Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6Lisp Tutorial for Pythonista Day 6
Lisp Tutorial for Pythonista Day 6
Ransui Iso
?
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
リバースエンジニアリングのための新しいトレース手法 - PacSec 2010
Tsukasa Oi
?
尝笔滨颁レベル1技术解説セミナー(2012/11/11)
尝笔滨颁レベル1技术解説セミナー(2012/11/11)尝笔滨颁レベル1技术解説セミナー(2012/11/11)
尝笔滨颁レベル1技术解説セミナー(2012/11/11)
Kazuko Itoda
?
Ad

【学习メモ#4迟丑】12ステップで作る组込み翱厂自作入门

  • 5. フラッシュROMの書き込み回数 ● フラッシュROMの書き込み回数には制限がある – H8/3069Fでは最悪100回(通常の利用の範囲なら1000 回) ● これから開発を進めていく上で上限に達してし まうので、フラッシュROMに直接書き込む代わ りにOSをシリアル経由でダウンロードして、そ れをRAMに展開して起動するプログラムをフ ラッシュROMに書き込む方法を取る ● このプログラムをブートローダと呼ぶ – IPLもブートローダと同じ意味合いかな
  • 6. ブートローダ ● 電源ONでまずブートローダを起動させ、それか らOSをダウンロードし、OSを起動させる ● こうして段階を踏んでOSを起動する手順を一般 的にブートストラップと呼ぶ ● これでOSを修正する度にフラッシュROMに書き 込まずにすむ – これは開発段階の話で、実際なら製品化のときにフ ラッシュROMに直接書き込んで普通にROMから起動さ せることが多い(ROM化と言う) ● ROM化の方法が紹介されているが今回はROM化し ないので省略
  • 7. シリアル経由でファイル転送 ● 今回作成するブートローダは次の3つの機能が 必要となる – シリアル経由でOSをダウンロードし、RAM上にいっ たん保存する – 保存したOSを適切にRAM上に展開 – RAM上に展開したOSを実行
  • 8. シリアル経由でのダウンロード ● 今まではkzloadというファイルをフラッシュ ROMに直接書き込んでいたけど、これがシリア ル経由でマイコンに転送する方法に変わる ● そこで利用するプロトコルがXMODEMというプロ トコル – 昔からあるシリアル経由でのファイル転送のプロト コルで、仕様が簡単なので実装の手間もかからない – ただし、転送効率は悪いし、信頼性も低い – 今回はそういったことはシビアに考える必要はない ので、問題はないとのこと
  • 9. XMODEMの仕様(送信側) ● ①受信側から定期的に送信されるNAK(ox15)を受けた ら送信を開始 ● ②データはブロック単位に分けて送信する。ブロック は固定長なので、ファイルの終端なおでデータ量が足 りない場合にはEOF(x01a)で埋める ● ③1ブロック送信したらACK(0x06)かNAKが返ってくる のを待つ。ACKの場合には、引き続き次のブロックを 送信。NAKの場合には同じブロックを転送 ● ④データの終わりはEOT(0x04)を送信し、ACKが返って きたら終了 ● ⑤中断したい場合はCAN(0x18)を送信する。CANを受け たら中断
  • 10. XMODEMの仕様(受信側) ● ①受信準備ができたら合図として定期的にNAKを送 信。シリアルから文字を受信したらデータ受信開始 ● ②SOH(0x01)を受けたら連続するデータをブロックと して受信。受信に成功したらACKを返す。失敗したら (チェックサムエラーなど)NAKを返す ● ③EOTを受けたらACKをかえして終了 ● ④中断したい場合はCANを送信。CANを受けたら中断
  • 11. ブロックのフォーマット ● 送信するブロックのフォーマットは以下の通り a b c d e 127頁 図4.1 XMODEMのブロック?フォーマット より フィールド サイズ 意味 a 1バイト SOH b 1バイト ブロック番号。1からの通番で、255の次は0になる c 1バイト ブロック番号をビット反転したもの(チェック用) d 128バイト データ。データが128バイトに満たない場合はEOFで埋める e 1バイト データ部のチェックサム 128頁 表4.1 各フィールドの意味 より
  • 12. ACKとNAK ● ACK(ACKnowledge) – 受信成功時の応答として送信されるコード ● NAK(NegativeAcKnowledge) – エラー時の応答として送信されるコード
  • 14. プログラムの修正とファイル追加 ● 追加ファイル – xmodem.h、xmodem.c...XMODEMプロトコル実装 ● 修正ファイル – main.c...コマンド動作を実装 – id.scr...bufferセクションを追加 – serial.h、serial.c...文字の受信を実装 – lib.h、lib.c...文字列受信用のライブラリ関数追加 – Makefile
  • 15. XMODEM実装 ● xmodem.cは受信用の処理を行なっている – 送信はlrzszのlsxというアプリを使うみたい(cuコ マンドだと) ● 仕様についてはスライド9pを参照
  • 16. ld.scr ● ダウンロードしたファイルを配置する場所を定 義している – これは#defineでヘッダファイルに書くことが多い が、今回はリンカ?スクリプトをメモリマップとし て扱うためリンカ?スクリプトに書く buffer(rwx) : o = 0xffdf20, l = 0x001d00 ~~~~~~~~~~~ .rodata { } > rom .buffer : { _buffer_start = . ; } > buffer
  • 17. その他修正コード ● serial.cは受信用の関数を追加 ● lib.cも受信用のライブラリ関数を追加 ● Mekefileはxmodem.oをコンパイル対象にしただ け
  • 18. lrzszインストール ● MacでXMODEMプロトコルによる転送を行う場 合、lrzszをインストールする必要がある ● 最も簡単な方法はhomebrewからインストールす ること ● homebrewが何か分からない場合は検索して ● インストール方法はターミナルから下記のよう に入力するだけ $ brew install lrzsz
  • 19. lsxの使い方 ● lrzszのうち、lsxというXMODEMプロトコルの転 送アプリを使って転送を行う ● 書籍では~CLocal command? lsx defines.hみた いに入力しろとあるが、Macではうまくいかな い ● ~+lsx defines.hとするように注意すること – なるべく早く~+と打つ
  • 20. プログラム実行(load) /Users/sandai/12step/src/04/bootload% sudo cu -l /dev/tty.usbserial-FTG6PQ4H Password: Connected. kzload (kozos boot loader) started. kzload> load ~+lsx defines.h Sending defines.h, 1 blocks: Give your local XMODEM receive command now. Bytes Sent: 256 BPS:65 Transfer complete XMODEM receive succeeded!
  • 21. プログラム実行(dump) /Users/sandai/12step/src/04/bootload% sudo cu -l /dev/tty.usbserial-FTG6PQ4H . . . Transfer complete XMODEM receive succeeded! kzload> dump size: 100 23 69 66 6e 64 65 66 20 5f 44 45 46 49 4e 45 53 5f 48 5f 49 4e 43 4c 55 44 45 44 5f 0a 23 64 65 66 69 6e 65 20 5f 44 45 46 49 4e 45 53 5f 48 5f 49 4e 43 4c 55 44 45 44 5f 0a 0a 23 64 65 66 69 6e 65 20 4e 55 4c 4c 20 28 28 76 6f 69 64 20 2a . .
  • 22. dumpの確認 ● dumpコマンドを使うと前のページのように転送 したファイルが16進数で表示される ● 実際にうまく転送できているかどうか、オリジ ナルのdefines.hと比較してみるには、ターミ ナルで下記のようにコマンド /Users/sandai/12step/src/04/bootload% hexdump -C defines.h 00000000 23 69 66 6e 64 65 66 20 5f 44 45 46 49 4e 45 53 |#ifndef _DEFINES| 00000010 5f 48 5f 49 4e 43 4c 55 44 45 44 5f 0a 23 64 65 |_H_INCLUDED_.#de| 00000020 66 69 6e 65 20 5f 44 45 46 49 4e 45 53 5f 48 5f |fine _DEFINES_H_| 00000030 49 4e 43 4c 55 44 45 44 5f 0a 0a 23 64 65 66 69 |INCLUDED_..#defi| 00000040 6e 65 20 4e 55 4c 4c 20 28 28 76 6f 69 64 20 2a |ne NULL ((void *| . . .
  • 24. まとめ ● XMODEMプロトコルを実装してファイル転送を 行った ● 特に複雑な概念や用語は出て来なかったので、 気楽にできる – ただまあXMODEMの実装がちょっとあれ。送信側の コードがないからはっきりイメージはできない。と はいえ、単純なプロトコルで分かりやすいといえば 分かりやすい ● ~+lsxの部分は、Macであれば書籍の通りではう まくいかないので気をつける
  • 26. アセンブラ?プログラミング ● OSを自作する場合アセンブラの知識が必須 ● アセンブラでないと記述できない部分があるか ら(アセンブラで書くべき部分) – スタートアップ – 割込みの入力と出口 – スレッドのディスパッチ ● 全部の命令を覚える必要はない ● やりたいことだけできるようになれば十分
  • 27. スタック ● たとえばforで使うカウンタ変数をずっとメモ リ上に置いとくのは邪魔で無駄 ● そこで自動変数みたいなのがある – 関数に入ったときに獲得され、関数から出たら捨て られるやつ ● でまあこういった扱いをするためにスタックを 使う – スタックを管理するために利用されるポインタをス タック?ポインタ – 関数単位でスタック上に確保される領域をスタッ ク?フレーム
  • 28. 自動変数のスタックは意識しない ● スタック?ポインタやスタック?フレームの詳 細は検索で適当に調べると良い ● C言語でプログラムを書く場合は、普通はこん なことは意識しない ● C言語側でいろいろ調節してくれる – というかコンパイラだろうね
  • 29. アセンブリ言語について ● CPUはメモリ上にある機械語命令を逐次実行し ていく ● しかしメモリ上には数値しか保存できない ● だから、アセンブリ言語の命令ってのは数値の こと – ただし数値だと人間は扱いにくいので、ニーモニッ クでコードを書く ● ニーモニックは普通に文字打ってプログラミン グできるようにしたもの ● とはいえ、命令はアセンブラで数値に変換され る。数値というか実行形式ね
  • 30. CPUのレジスタ ● CPU内部にある記憶領域 – 汎用OSに慣れている者からすれば、周辺機器の持つ レジスタよりこっちの方が一般的 ● CPUは加算や減算などの数値計算を行うための 回路を持っているが、これらの回路の入力や出 力はレジスタに接続されている – つまりレジスタを経由して行われるってことね – だからメモリ上のデータはこのレジスタに読み込ん でから処理が行われる
  • 31. ロードとストア ● メモリ上の値をレジスタに読み込むことをロー ドと呼ぶ ● レジスタの値をメモリ上に書き込むことをスト アと呼ぶ ● メモリ上のデータのロードやストア、演算など 汎用的に利用されるレジスタを汎用レジスタと 呼ぶ – どのレジスタをどう使うかってのがよくわからんが なあ
  • 32. プログラム?カウンタ(PC) ● 汎用レジスタとは別の重要なレジスタでプログ ラム?カウンタがある – CPUが現在実行中の命令のアドレスを指す ● 実行中というか次のアドレス ● CPUはPCを加算しつつPCの指すメモリ先の命令 を逐次実行しながら処理を進めていくわけ – PCは次の命令を指す位置まで自動で加算される ● PCの役割ってのはいわゆるジャンプ命令 – C言語でいうところのgoto – ジャンプ命令はPCへの値の代入にすぎない
  • 33. オペコードとオペランド ● アセンブリの命令を表す部分をオペコードと呼 ぶ。命令に対する引数に相当する部分をオペラ ンドと呼ぶ ● こういったものを人間がわかりやすいようにし たのがニーモニック オペコード ↓ オペランド ↓ ↓ ld r1, 0x8000 ← 実際ldってのは0x01みたいな数値 ld r2, 0x8004 ← だけどそれじゃあわかりにくい add r3, r1, r2 ← そこでldとかaddとか文字を使う st r3, 0x8010 ← こういう表現をニーモニックと呼ぶ
  • 34. インストラクション ● 機械語の命令はインストラクションとも呼ばれ る – どの数値がどの命令として動作するかという 気もありを、命令セットとかインストラク ション?セットという ● 命令セットはCPUごとに違う – H8とx86じゃやっぱり違うらしい – 見た限りでは結構似ている – 命令じゃないけどレジスタ名は違うな
  • 35. アセンブル、アセンブラ ● アセンブリ言語で書いたコードを機械語コード のバイト列に変換する作業をアセンブルと言う – 昔は手でやってたからハンド?アセンブルなんて言 葉も残ってる ● アセンブルを行うプログラムをアセンブラと呼 ぶ – コンパイラみたいな位置づけで考えればイメージし やすい ● 機械語コードをアセンブラに逆変換することを 逆アセンブルと呼ぶ
  • 36. おわり ● このあと実行形式ファイルを逆アセンブルして いろいろ解説されているが、かなり長くなるの でここで終わる ● 汎用OSであればアセンブリ周りはGASやNASMで やればいいと思うのでこのあたりは流してもい いんじゃないかな ● でも勉強になるっちゃなる