機械語なら俺に質問しろ!その2

■ このスレッドは過去ログ倉庫に格納されています
2012/12/29(土) 08:00:24.36
漏れは今までにC、C++、Pascal、HSP、JS、VBなど
数々の言語を極めてきたがやはり一番手にしっくりくる言語は機械語だ。

だから、機械語のことなら何でも質問しろ!
ただプログラムのコードなんかは長くなるがな。 あ、ASMの話でもいいよ。
2013/01/03(木) 11:58:21.96
マシン同士の会話が始まっちゃったんで
どっちかが焼き切れるのを待とうや
2013/01/03(木) 12:07:40.19
>>34
>で、 char main[] = { ... の場合に、配列の初期値なんてものを作って、実行時にコピーする環境が実在するの?

ROM化前提ならそれが普通。
2013/01/03(木) 12:14:04.96
>>34
>で、 char main[] = { ... の場合に、配列の初期値なんてものを作って、実行時にコピーする環境が実在するの?

ローダーがRAM上にプログラム読み込んで実行する環境しか知らんみたいね。
2013/01/03(木) 14:27:54.77
実家から戻ってきてみたら、まだやってたぜこれ

そんなことよりおまえらことよろな
2013/01/04(金) 04:05:14.23
ん、今年も宜しく。
2013/01/04(金) 05:01:31.35
LSIC-85 で、stpcpy見つけてうまくいったから、RX200で使おうとしたら、無かった。
LSIC.man 見たら、MS/DOSでしか使えないって書いてあった(w
2013/01/04(金) 05:27:58.05
>LSIC-85 で、

新製品?
2013/01/04(金) 05:44:46.63
>>40
glibcやnewlibにもあるしそんな珍しいもんでもないと思うが。
http://www.gnu.org/software/libc/manual/html_node/Copying-and-Concatenation.html#index-stpcpy-502
http://sourceware.org/newlib/libc.html#stpcpy
2013/01/04(金) 05:47:13.65
http://pubs.opengroup.org/onlinepubs/9699919799/functions/stpcpy.html
2013/01/04(金) 15:33:17.32
>>34
char main[]のアドレスが実行可能かどうかもアレだけど、
そもそもこれってリンクの段階でリンカはシンボル名しか見てなくてそれが関数
なのか配列なのかはお構いなしってことだよね。
普通Cの処理系ってそういうものなんだっけ? 例えば配列だとリンクできないような
処理系はないのかな?
2013/01/04(金) 15:48:11.68
>>44
処理系に拠るんじゃないかな。
Cだと最初の初期化ルーチンで初期化を行った後にmain()を呼び出すけど、
リロケータブルオブジェクトには大抵セグメント情報が付いてて、コードセグメントに
配置された初期化ルーチンからデータセグメントのmain[]を呼び出せない
アーキテクチャは普通にあるから、それをリンカがエラーとするか、データセグメントに
配置されたmain[]のアドレスを単なる値としてリンクを成功させるかは処理系に
拠る筈。安全の面では前者が望ましいのは勿論。
2013/01/04(金) 18:44:29.48
>>36
いや、俺の普通は ROM から直接実行する環境。
>>37
逆じゃないの?

>>44
全ての処理系/実行環境で有効だと主張したつもりはないので、
説明不足だと言って非難するなら、そこは甘受しよう。
2013/01/04(金) 18:55:24.26
>>46
> >>37
> 逆じゃないの?

> で、 char main[] = { ... の場合に、配列の初期値なんてものを作って、実行時にコピーする環境が実在するの?

じゃあ君の普通の環境では、const 宣言もない main[] が ROM に配置されんの?
2013/01/04(金) 21:42:16.52
>>45
手持ちのMac OS Xでやってみたら、リンクはできました。char main[]は
データセグメントにある。
実行するとmainにジャンプした時点で死亡。実行属性が付いてないので。
mainが呼ばれる前に実行属性を付ける処理を呼ぶとmainを実行できたw

>>46
自分は基本PCのOSしか知らないんですが、元の話で暗黙のうちに想定している
環境は何ですか? やはりプラットフォーム依存性が高いかと。
組み込み系とか興味はあります。

というわけで話を膨らませてみたつもりw
2013/01/05(土) 08:39:35.88
クリックするだけで感染、みたいなのが多かった時期にソースを読んでると、
コード内にマシン語がデータとして居るのは、珍しくはない光景だったんだな
組み込みじゃないけど
2013/01/05(土) 15:10:12.18
>>41 ごめん、LSIC-80の8085用オプションで。
2013/01/05(土) 15:22:09.39
>>49
いわゆるトランポリンコードを実行するにはスタックとかヒープに実行属性が
付いてないとできないけど、今はセキュリティ上の問題になる。

でも古いコードだとそういうテクニックを使ってたりするのがあるから、互換性を
保つには闇雲に実行属性を落とせなかったり。
ユーザーの皆さん、古いアプリのサポートを打ち切るのは単に新しいバージョン
を買うように仕向けている訳じゃないんですよ、みたいなw
2013/01/05(土) 15:37:34.76
>>50
> LSIC-80の8085用オプション

8085って8080から拡張された入出力と割り込み機能をサポートする命令が2つ増えただけで
公式には8080と大して命令変わってないと思ったけど、LSI C-80って8085用の特別な機能
でもあんの?
2013/01/06(日) 06:05:16.68
アセンブリフェーズがNR80だから、正確には8080のコード吐くんですね。
SIMとRIMはニーモニックが認められないので、DC 20h/30h で書きます。
_LCC80ファイルの中身見直したら、-i8080 -RN で8085固有の指定はありませんでした。
2013/01/06(日) 19:45:24.08
非公開命令でも吐いたら面白いのになあ。仕事では使えんけど。
http://home.comcast.net/~kvaughn65D/UnDocum_8085_Instructions.pdf
2013/01/07(月) 06:41:05.63
私が自分用に作ったメモにもこのインストラクションは載ってました。
8080から改良するときに、ちょっと凝ったプログラミングをできるように
という思想が感じられますね。
このページ、活字が小さくて見づらい。だれかtextにしてくれないかな。
56デフォルトの名無しさん
垢版 |
2013/01/08(火) 15:45:46.76
うーんわからない。とあるUNIX(x86_64)のプログラムだけど、

(gdb) i r
rax 0x00
rdi 0x800f5539034375816080
rip 0x800c7cff90x800c7cff9
(gdp) x/i 0x800c7cff9
0x800c7cff9 mov (%rdi),%rax
(gdb) x/xg 0x800f55390
0x800f55390 0x0000000800f5bf98
(gdb) stepi
(gdb) i r
rax 0x800f5bfcc34375843788
rdi 0x800f5539034375816080
rip 0x800c7cffc0x800c7cffc

なんでraxが0x800f5bf98にならずに0x800f5bfccになるの?
テストプログラムで
mov (%rdi),%rax
を実行させても正しく間接参照する。C2Dのバグ疑ってもいいかな。
2013/01/08(火) 16:01:03.11
あっとタブが飛んだ 再投稿

うーんわからない。とあるUNIX(x86_64)のプログラムだけど、

(gdb) i r
rax 0x00
rdi 0x800f55390 34375816080
rip 0x800c7cff9 0x800c7cff9
(gdp) x/i 0x800c7cff9
0x800c7cff9 mov (%rdi),%rax
(gdb) x/xg 0x800f55390
0x800f55390 0x0000000800f5bf98
(gdb) stepi
(gdb) i r
rax 0x800f5bfcc 34375843788
rdi 0x800f55390 34375816080
rip 0x800c7cffc 0x800c7cffc

なんでraxが0x800f5bf98にならずに0x800f5bfccになるの?
テストプログラムで
mov (%rdi),%rax
を実行させても正しく間接参照する。C2Dのバグ疑ってもいいかな。
2013/01/08(火) 16:11:02.74
>>57
なんで最後に

>(gdb) x/xg 0x800f55390

も一回やらんの?
2013/01/08(火) 16:17:03.34
変わってなかったのでコピペしませんでした。
(gdb) x/xg 0x800f55390
0x800f55390 0x0000000800f5bf98
2013/01/08(火) 16:18:59.10
念のために逆アセのバグも疑ってみない?
2013/01/08(火) 16:28:15.43
それも疑ってみてました。正しいようです
(gdb) x/3xb 0x800c7cff9
0x800c7cff9 0x48 0x8b 0x07

テストプログラム
(gdb) x/4i aaa
0x4006f0 <aaa>: mov %rdi,-0x8(%rsp)
0x4006f5 <aaa+5>: mov -0x8(%rsp),%rdi
0x4006fa <aaa+10>: mov (%rdi),%rax
0x4006fd <aaa+13>: retq
(gdb) x/3xb 0x4006fa
0x4006fa <aaa+10>: 0x48 0x8b 0x07

違うコンパイラでコンパイルしてみたらコンパイルが終了しない...
2013/01/08(火) 16:44:41.08
>>61
>違うコンパイラでコンパイルしてみたらコンパイルが終了しない...

C2Dのバグかも?w
2013/01/08(火) 17:06:08.41
プログラムで合成されたCソースで、コンパイラへの負荷がかなり高い部分があって、
cc1がCPU利用率100%に張り付いて終了しない。
スラッシング起こすほどのメモリは使ってないようだけど。小一時間放置してみる
2013/01/08(火) 17:10:58.31
理解できない現象を何でも自分以外のせいにするのは素人。
2013/01/08(火) 17:22:11.70
コンパイルの山場は通過した模様。
たかだが50000行くらいのソースのコンパイルに20分くらいかかった。
2013/01/08(火) 17:25:44.71
>>61
>違うコンパイラでコンパイルしてみたら

C2Dのバグ疑うかってのに、同じCPU違うコンパイラで偶々動いたとしてそれでいい訳?
2013/01/08(火) 17:38:49.14
行きつく先がC2Dかはわからないけど、動く条件と動かない条件絞っていかないと
原因にたどり着けないでしょ。

問題の個所は別の呼び出しでは問題なく通っているので、
原因がC2Dと仮定するとえれー複雑な条件が必須なはずでお手上げかもだけど。

実は「おめーがx64のアセンブラ知らねーのが原因、その命令は他のレジスタも
参照してる」とかいう罵声も期待してたけど、飛んでこないところをみるとそう
じゃなかったらしい。

ちなみにシングルスレッドなので別スレッドが書き換えてるもないです。(多分)
2013/01/08(火) 17:43:19.05
>>67
>ちなみにシングルスレッドなので別スレッドが書き換えてるもないです。(多分)

プロセッサのバグ疑うんならOSも疑うべきだろ
2013/01/08(火) 17:47:02.78
>>67
>行きつく先がC2Dかはわからないけど、動く条件と動かない条件絞っていかないと
>原因にたどり着けないでしょ。

別のコンパイラ試すってのは条件絞ってることにはならんよ。
2013/01/08(火) 18:00:40.95
やり方によってはなるよ。
2013/01/08(火) 18:05:39.70
ならないよ
2013/01/08(火) 18:10:49.10
別のコンパイラを試した → 動いた → 前のコンパイラが原因

とはならない。可能性のひとつとして考えられるというだけ。

前のコンパイラが原因の可能性のひとつであるということは別のコンパイラを試す前と変わらない。
2013/01/08(火) 18:22:00.06
コンパイラ変えてコンパイルしなおすだけだったら、そうだろうね。
やってる本人が出来るといってる方法でやってるんだからいいじゃん。
2013/01/08(火) 18:48:48.76
やってる方法がトンチンカンだから書いてるプログラムがクソであることは容易に想像がつく
2013/01/08(火) 19:03:04.86
自分が想像できない事に言いがかり付けない方がいいよ。

ゴミクズみたいのが絡んできたし、これ以上有益な情報得られない
だろうから退散します。
結果わかったら報告しに戻ってくるかも。
2013/01/08(火) 19:07:41.55
最後までクズでした
2013/01/08(火) 19:10:51.57
説明の責任は質問する側にあることが解ってないお子様なんだろう
2013/01/09(水) 08:07:08.02
>自分が想像できない事に言いがかり付けない方がいいよ。
これが噂に聞くブーメランと言う奴か。
79デフォルトの名無しさん
垢版 |
2013/01/09(水) 10:37:54.94
ゴミクズが粘着してるだろうなと思って覗いてみたら案の定粘着しててわろた。

説明責任とか言いながら、詳しく説明されてない方法を「それではできない」とか
断定しちゃう頭の悪さに気づかないのだろうか。

久しぶりに質問者側に回ってみたが、ゴミクズの最底辺さにはあきれ返る。
ほら、遊んでやるからかかってこいよ。
2013/01/09(水) 10:47:15.76
あら?バカが釣れてるw
2013/01/09(水) 12:11:23.99
x64のいい逆汗ないかねえ
IDAが有名だが、x64は割らないと無理だし。
2013/01/09(水) 12:17:43.96
あら、普通に買えばいいじゃない
http://www.hex-rays.com/products/ida/index.shtml
83デフォルトの名無しさん
垢版 |
2013/01/09(水) 18:09:45.44
貧乏人ばっかだな
2013/01/09(水) 21:42:03.32
汗・逆汗で食ってるわけじゃないからねえ
予算が下りないんだよ
2013/01/10(木) 12:39:59.48
>>84
遊びなら自腹切れよ
2013/01/10(木) 12:42:56.41
そして>>81にもどる
87デフォルトの名無しさん
垢版 |
2013/01/30(水) 12:47:58.45
windbgじゃダメなのでしょうか?
他のデバッガにはそんなに便利な機能ありますか?
2013/01/30(水) 12:52:16.21
>>87
おまえはそれ使ってればいい
2013/01/30(水) 22:12:17.27
使途にもよるが、プラグインアリなら、かなり強力
VMと組み合わせて、仮想シリアルデバッグも楽しい

あとntsd/cdbもよろしく。
2013/01/30(水) 23:13:06.24
今時, たくさん並ぶコンソールのスイッチを ON/OFF して,
ロードスイッチを押す作業のなにが楽しいんですか?

俺なら, 迷わずアセンブリ言語を選択します
2013/02/01(金) 12:02:59.17
1バイトずつ打ち込むような体験も、一度はしてみとくべきだとおもうんだ
壊れやすいパチパチスイッチはこわいから、大幅に譲ってテンキー(0-9A-F)でいいよ
92デフォルトの名無しさん
垢版 |
2013/02/02(土) 18:10:08.52
ポリオミノを生成するプログラムを教えてください(できればC言語で)
2013/02/02(土) 22:39:14.96
マルチ乙
2013/02/02(土) 23:07:42.22
はわわー
2013/02/03(日) 04:36:49.09
RX210 CPUマニュアルの内蔵ROMへのプログラム/イレーズの所を読んでいます。

FENTRYRのLSB側に01hまたは02hを書いた以降にROMリードが起きると
ROMアクセス違反でコマンドロック状態が発生する。
だから 「RAMへジャンプしてから」 FENTRYR を書き替えている。

この理解で合っていますでしょうか?
9695
垢版 |
2013/02/03(日) 05:18:07.27
上のはたぶん合っていると思うんですけど、そうすると、reset時にFCUに対して
周辺クロック通知コマンドを使うときに、hwsetup( )はROMで動くから困るんじゃ
ないかなあ・・・FENTRYRのLSBに01hを書いてからコマンドを書くんだけど、
FENTRYRを書き替えた直後からROMアクセス違反が発生しちゃうことになる。
2013/02/03(日) 09:13:19.07
こんなところで仕事の質問をするものではない。
ばれたらどうなるか考えてみな。
2013/02/03(日) 09:18:09.37
答えられる奴が気軽に答えればいい
仕事の話なら、ここでヒントもらって、裏を自分で取ればいい そこは仕事。

今までwebの仕事ごくろうさん、午後から組み込みやってください、ソロで。
みたいな無理ゲーもいまどきあるらしいじゃないか。

俺はアマだが、汗しらない奴の、いまさら人に聞けない質問には付き合ってるぜ
9995
垢版 |
2013/02/04(月) 03:43:35.95
リングバッファのリード/ライトポインタから滞留数を計算する手法を教えてもらった
のがこのスレだったような。 あれで滞留数の変数を追放できて役に立ちました。

今度のは新しい石だから、さすがにまだ体験者は居ないのかなあ・・・
マニュアルを何十辺も読んでると、こういう意味で書いてるのかなと判る所もあるけど、
ホント悪文だし。ここ2ヶ月でリビジョン3つも進んでるから変わってる最中。
10095
垢版 |
2013/02/07(木) 17:30:14.02
RX210の、コード格納用ROMとデータ格納用ROMの章がようやく理解できてきた。

コード格納用ROMのプログラム手法の説明 40.6.4.2(5) プログラム方法 で言ってる手順
第3 サイクルのアクセスでは、プログラム対象領域の先頭アドレスに対して
書き込みデータをワードサイズで書いてください。この際、先頭アドレスは
128 バイト境界にアラインしたアドレスを使用してください。

と、40.6.2 FCU コマンド一覧 表40.6 FCUコマンドのフォーマット
で言ってるWAの表現に矛盾があると思う。
WA: ROM 書き込み先アドレス
    書き込みデータ2/8/128 バイトの先頭アドレス

前者は128byteアラインだけでいいと言っているし、後者は書き込みデータのアライン
2/8/128 に従え と言っている。 誰かこれ体験して解明した人居ませんか?
2013/02/07(木) 17:50:00.83
両方で128バイト境界って言ってるんだからそれに従えばいいじゃん
10295
垢版 |
2013/02/10(日) 04:55:01.52
へうのリンク制御文(ツールチェインのリンカタブ)とスタック(dbsct.c)の関係が判った。
スタックサイズ768がデフォで、これが変数領域のすぐ後ろに配置されてしまう。
「RAMの残りサイズ」がスタックになるような指定はできないのかな?
2013/02/10(日) 06:25:14.17
隣家スクリプトを書き換えればいい話ではなくて?
2013/02/10(日) 15:39:18.35
>>100
フラッシュメモリって消去ブロック>書き込みブロックになってることが多いんじゃないの?
あとはアドレスによってブロックサイズが異なってるとか。
10595
垢版 |
2013/02/11(月) 01:39:19.32
>>104 この石では消去ブロックは全体で1個(実装分全部)です。1回の書込コマンド
に続いてデータを2/8/128バイト書けるんですが、その時の書き始めのアドレス
について、マニュアルの2箇所で矛盾した表現になっています。

マニュアルの元を書く技術屋さんは、自然言語で表現することが苦手な人が多いので
私は前者が間違いだろうと思っていますが、既に体験した人が居れば裏が取れると
思い、ここで聞いてみた次第です。お客さんを通じてルネには質問を投げて貰いましたが
オフィシャルな回答が返ってくるのは当分先かと。 判ったらここに書きます。
2013/02/11(月) 10:02:23.60
だから、その2ちゃんで裏取るってのはやめれww

2ちゃんでヒント・経験談を取るのは大アリ
その対称に、誰でも気軽に答えることができる。
10795
垢版 |
2013/02/11(月) 13:17:59.51
んじゃ、また別の話で、ROMに焼いてあって起動するとRAMにロードして動くような
コードの作り方ってのは? 古代のメインフレームだと、BALR 0,Reg using *.Reg
でセルフリロケーティングな動作が書けたんだけど、H8系でへうだとusingの概念が
無いし。ROMからRAMにコピーしても再配置情報はROM空間のままだからRAMへ
ジャンプしただけじゃ動かないよね。
2013/02/11(月) 15:34:33.42
何のための相対ジャンプ命令だと思ってるんだよ馬鹿か。
2013/02/11(月) 21:08:36.29
x86厨な俺としては、call $+(文字列長) ってのがすぐに思い浮かぶが
11095
垢版 |
2013/02/12(火) 05:30:38.04
相対ジャンプの機構は理解しています。プログラムの要素はそれだけじゃありません。

ある関数だけをRAMにコピーしてそこをコールするとします。引数は3個まで (これは
レジスタ渡しが保証されるから) その関数内のforループなどは相対ジャンプでできて
いるから動くでしょうが、その関数がROMのどこかにある関数を呼んでいたらそのBSRの
オフセットは元のROM位置からのオフセットであって、コピー先のRAM位置からの
オフセットではありません。ROMからRAMへのコピーはできても、元のコードの再配置
情報は実行コードになった時点で失われてしまいますね。JSR 絶対番地 を使えば可能
ですが、このコールはBSR、このコールはJSR をプログラマが選べるCはありませんね。

こういうことを話してみて欲しいわけです。起動時ベクタは固定・行った先のROMも固定
そこからRAMにコピーして動くプログラムはどんな制約があるのか、どんな作りになれば
いいのか・・・
2013/02/12(火) 11:12:10.96
アセンブリ出力を加工してからアセンブルすればいいじゃん。
ROMにある関数のリストがあるなら自動化できるんだし。
11295
垢版 |
2013/02/12(火) 17:20:14.81
それも試みたことあります。JSRを手でBSRに直すとか。でも自動化できないし、
人的ミスを持ち込むことになるから、非・推奨な手法という評価になりました。

私が現在認識している制限は、単一関数で外部コールを含まないものなら可能。
複数の関数をリンクして作ったプログラムは、不確定要素が多くて不安、という段階。

Cコンパイラマニュアルのなかに、PIC/PID機能の利用 という章があり、ここで
一般的な注意事項が列挙されていました。usingの概念に似た手法が紹介されて
いましたので、そこを読んでいるところです。PICは Positionn Independent Code、
PIDは Position Independent Data のことだそうです。 紛らわしい略語ですね。
2013/02/13(水) 00:14:18.69
>>110
> JSR 絶対番地 を使えば可能ですが、このコールはBSR、このコールはJSR をプログラマが
> 選べるCはありませんね。

絶対番地呼び出したいなら、関数ポインタ経由で呼べばいいだけ。
2013/02/13(水) 02:59:54.64
それはROM関数だけを関数テーブルにするしかないんじゃないの。
関数名(実アドレス)でコールするからBSRかJSRか選べないという
アホな話になるわけですよ。ROMを呼ぶとわかっている関数だけを
コールテーブルにすれば終わりでしょ。
2013/02/13(水) 03:11:22.74
>>114
BIOSは処理ルーチンのアドレスに依存しないための工夫だから
それを参考にすればいいってことだね
11695
垢版 |
2013/02/13(水) 03:19:46.39
では、割り込みはどう扱われるでしょうか? 今ターゲットにしている石は、
割り込みベクタテーブルの先頭番地をベクタベースレジスタに設定するタイプです。
LINKしたときの割り込みベクタテーブルはROMの中を指していますね。
これは関数ポインタのテーブルだから、割り込み処理は必ずROMコールとなります。

これと、ROMイレーズ/プログラム中はROMを読んではいけない、ということをどう
両立させればよいのか、その手法で悩んでいます。
11795
垢版 |
2013/02/13(水) 03:28:12.72
>>100 の疑問、自分で考えた答は、後者が正しいと思います。 理由は、
第1、第2ステップでコマンドを書き込むアドレスが 「実装のどこでもよい」 と記述
されていること。それだと実際にデータを書き込むアドレスがどこかは、第3ステップの
書き始めのアドレスしか情報がありません。 終了コマンドも第1,2ステップと同じく
任意アドレスだし。 FCU側のプログラムを書くことを考えると、後者でないと整合性を
保てなくなります。
2013/02/13(水) 08:20:04.38
きっぱり言っておいてやるがな、


肩の力抜けwww


ROM書き換え中は、割込テーブルレジスタもRAMに移しちゃうんじゃないん?と
まずは思ったが、いまどきの石ってそこらへんややこしいんかな
あるいは、そこを書きかえるときだけは割込とめるとか

F3とかFBとか、「あのころ」はそんなことしてたな
2013/02/13(水) 20:18:53.75
>>116
ROMリライト中に動く前提のプログラムってのがまず理解できない。
ROMを書き直す=プログラムを更新するってことだから、その時点で
割り込みベクタテーブルに処理が飛んでくる可能性はゼロではないの。
後だしでプチプチ情報出されても振り回されるだけだよ。
2013/02/13(水) 20:28:38.85
ROMリライト中に動いちゃまずい機能は
ROMリライトの処理中は行わないようにすべきじゃ
121119
垢版 |
2013/02/13(水) 21:42:52.69
風呂に入ってデバッグしてきた。なんとなく状況は理解できたと思う。

1)ROMの一部を書き換える組み込みアプリを作りたい
2)ROM書き換え中はROMへのリードアクセスは禁止
3)ゆえにコードをRAMにコピーしてRAM上で動作させたい
4)リンカーの出力するバイナリはROMからの相対アドレスである
5)RAMにコピーしたコードの関数アドレスを手作業でリロケーションはできない
6)さてどうしたものか

まず2が真の時点でROM上でコードを動作させるのは不可能だから
全てのコードをRAMにコピーする前提で考える。
普通はロケーターを使うんだろうけど、話の雰囲気ではロケーターも
使えないっぽいからそれは考えない。
ならば全ての関数呼び出しを関数テーブル経由にするしかない。

第一段階としてブートストラップローダーを作る。こいつの仕事はROMの
コードを全てRAMにコピーすることと、関数呼び出し用に全ての関数を
呼び出すためのコールテーブルを作ること。もちろんコールテーブルの
関数アドレスはRAM先頭のオフセットを加える。
割り込みベクタテーブルもブートストラップが作成する。
もちろんブートストラップ動作中は割り込み禁止。

次に、関数呼び出しを統括するスーパーバイザー関数を作る。この関数
はブートストラップがRAM上に作った関数テーブルを元に、引数で指定
された関数を呼び出す。こうすることで、関数名=アドレス値がコードに
ビルトインされるのを防ぐ。

ここまで終わったら、ブートストラップがメイン処理に制御を移すだけ。

全ての処理は関数呼び出しに関数名は使わず、スーパーバイザー関数
に対して
2013/02/13(水) 21:46:31.11
>>121の最後2行は無視してください。
2013/02/13(水) 23:45:07.83
RAMが狭小で、フルイメージRAMに来れないんじゃないかとエスパー

機械語っていうか、石の話だが、関連雑談だな
12495
垢版 |
2013/02/14(木) 05:55:20.77
>>119 おつきあい下さりありがとうございます。10数年前、H8/16bitでそのような物を
作りました。その時はブートローダーの場所はイレーズしない・ROM書き換え/イレーズ
する関数のみRAMに置く、という手法でした。ブートローダーは割込を一切使わず動く
ように作りました。今回は、RAMはブートローダー全部を載せるぐらいたくさんあります。

ブートの目的は、ROMイレーズ・アプリをROMに焼くこと、焼かれたアプリはふつうに
ROMで動作します。電源ONで動くのはブートなので、アプリがROMに入っているか
チェックして、アプリに分岐するか、ROM焼きモードでブートの中で待つかします。
この方式だと、121後半の設定は不要ですね。ブート動作中は割込を使わないのは
今回も採用することになると思います。

>>123 そうなんです。ROM256/RAM32 とか、機種で多少はありますがそんな感じ。

ブートが固定ベクタを占有しちゃうんで、焼かれるアプリは固定ベクタを持たないこと。
ROM実装サイズがいろいろだが末尾に寄せて実装されている。FFFF0000〜FFFFFFFF
とか、FFFC0000〜FFFFFFFF とか。なので、ブートからアプリにジャンプする際には
「固定の先頭番地」 という過去の手法が使えないので、固定の末尾付近(ベクタのすぐ前)
を使うことになるのかな、と考えています。

後出し小出しが嫌われるのは承知していますが、課題全部はまだ承ってないし、
承っても1,2レスで列挙できるものでもないので、そこはご容赦くださいませ。
目下の選択は、ブートはROMで動く事にするか、ブートの主要部をRAMに転送するかで、
前者は実績があります。後者だと121の前半みたいなお膳立てをPGがやるわけですね。
う〜ん、厄介そうだなあ。 インテルの再配置ローダーみたいなツールがあればいいのに。
2013/02/14(木) 15:20:59.70
組み込みじゃなくてすまんが、ローダ付きのCOMファイルみたいのを連想するw
2013/02/14(木) 20:38:30.06
> インテルの再配置ローダーみたいなツール
転送時点で再配置しとけばいいだけでしょ
読み込んでから再配置しようとか、難しく考えてるような
12795
垢版 |
2013/02/15(金) 02:49:18.57
EXEファイルと違ってROM上の実行コードには再配置情報は残っていません。
私が過去に実現したのは、再配置情報を含まないことが確認済みの関数だけを
RAMに転送してコールするという手法でした。
2013/02/15(金) 05:12:38.47
hexファイルに再配置情報がないのだから
移動先のアドレスで動くhexファイルを作っておいたらってことだけど
移動先に移動させる仕掛けはどっかに必要だけどね

ROM、RAM領域のアドレスが移動できるarmで
boot時にROMは0から見えるけど
最終的には上位番地でROMの実行コードが走ることをやったことある
(RAM領域は最終的に0番地から見える)
2013/02/15(金) 09:12:16.11
reloc情報つきのモジュールを置いて、それを自前ローダにくわせてはだめなんか
超小型車輪の自社開発みたいになるが

感覚的には
void* loader(void* _code, int _codesize, WORD* _relocs, int _relocssize);
13095
垢版 |
2013/02/15(金) 17:10:10.76
>>128 実行空間と格納空間を別に指定できるLINKの仕方がHewにあるかどうか
なのですよ。ビルド−ツールチェイン−リンカのタブにそれっぽいのが無いみたい。
それがあれば、例えばFFFF0000番地にロードするイメージを00100000番地に格納
みたいなことができるのですけどね。ただ、コンパイラのマニュアルにpic,pidオプション
ってのがある所から見ると、copyしても動くようなオプションつけてビルドしなさいと読める
2013/02/15(金) 18:26:44.31
FFFF0000番地にロードするイメージのhexファイルを一度作って
00100000番地に格納出来るhexファイルに加工するほうが
悩まなくて済むような
13295
垢版 |
2013/02/16(土) 03:47:45.45
いや、だからそれは再配置情報が失われているって(w
13395
垢版 |
2013/02/16(土) 04:34:12.70
コンパイラマニュアルのリンケージエディタの使い方:セクションオプションの章を見ると
>>130 みたいな割り付け方法は無さそう。なので一般的な手法としては pic,pid 指定を
付けてビルドし、130の例で言えば00100000番地でリンク、実行時にFFFF0000番地へ
copyして実行、という流れになると思います。固定ベクタのResetVect(再末尾)は
ROMの実行開始部を指し、そこは最低限RAMへcopyしてジャンプするコードを置く。

Hardwaresetup( ) の部分なんかはRAMで実行する必然性は無いので、reset時ROMで
実行してもかまわないでしょう。ただ、「RAMで実行することが必然」 な機能が何かという
ことを考えてゆくと、以前の仕事みたいにROMとRAMを行き来する手法もありかな、と。
後者の利点は、CODEを置くためのRAMが少量で済むこと・再配置情報が無いルーチン
だけを置くことで再配置問題を回避できること。
2013/02/16(土) 09:03:49.43
開始アドレスだけかえて複数のhexファイルつくって、
比較して、reloc情報を起こせばいいんじゃないかと

そんなので済むかって?
そんなので済むように書けるのが、機械語じゃないかw
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況