質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

915閲覧

ブートローダプログラムで。

Mr.kyousuke

総合スコア13

アセンブリ言語

アセンブリ言語とは、機械語を人間にわかりやすい形で記述した低水準言語です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

1クリップ

投稿2022/12/14 15:24

編集2022/12/19 04:23

RXマイコンを使ってプログラムを書いています。
ブートローダのプログラムを書いています。

アドレス空間↓
RAM
アドレス サイズ 機能
0x08000000 0x100000(1MB) ブートローダ ①
0x08100000 0x700000(7MB) アプリケーション ②

内蔵ROM(コードフラッシュメモリ)
アドレス サイズ 機能
0xFFC00000 0x200000(2MB) アプリケーション ③
0xFFF00000 0x100000(1MB) ブートローダ ④

動作↓
④のアドレスでブートローダーを起動する。
(A)ブートローダーを①にコピーして①にジャンプします。(A)
③に、ここでアプリケーションを書き込みます。
ここまでは動いています。

今度は、リセット後に、④のアドレスでブートローダーを起動し、
基板のディップSWの状態をみて、(A)を実行するか。
③を②にコピーして②にジャンプするかの2パターンにしたいと考えています。

スタートアップルーチンは以下のような形です。
.section P
.glb _reset
_reset:
; 割り込み用スタック、ユーザースタックポインタの初期化
; プロセッサステータスワードの初期化

bsr _mcu_ini ; Cの関数。CPUのRMA,クロック、端子の初期化、RAMへコピー ; 0x08000000の初期化ルーチンへジャンプ

アセンブリ言語をほとんどしらず、個人的には、mcu_iniでDSWの状態をよみ
その戻り値などが使えると仮定して、
; 0x08000000の初期化ルーチンへいくか
; 0x08100000の初期化ルーチンへいくか切り分けができないかと考えています。

何かよい方法はないでしょうか。。
アセンブリで書きたいと思っています。

コンパイラ:CCRX
環境:e2studio

以下を考えました。↓
SWのポートの値を取得して比較するところをどうやればいいのか。。

SWの値を読む(P01の値) (ポート入力データレジスタ(PIDR)、PORT1.PIDR 0008 C041h) cmp DSWの値, 1 jle .L2 mov.l #__INIT, r1 ; RAMへジャンプ準備 and #000FFFFFh, r1 ; or #08000000h, r1 ; jmp r1 ;

.L2:
mov.l #__INIT, r1 ;
and #000FFFFFh, r1 ;
or #08100000h, r1 ;
jmp r1 ;

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2022/12/14 15:29

なにがわからないんでしょうか
thkana

2022/12/14 21:55

「よい方法」を求めるからには、なにか評価すべき点や解決すべき問題点があるのかと思いますが、それはなんですか?
Mr.kyousuke

2022/12/14 23:03

上記のスタートアップルーチンで、mcu_iniに分岐してから、SWのオンオフで戻り地を1か0を返したいと考えています。 その値によって、どちらにいくか分岐したいのです。
Mr.kyousuke

2022/12/14 23:42

そのやり方が調べてもわからず。
thkana

2022/12/15 00:27

もしかして、「アセンブラがわからないのでできません」と言っているだけですか? であれば、勉強してください、としか言いようがないですが。 そういう問題ではないということなら、「わかりません」ではなくて、問題点を明確にしてください。
dodox86

2022/12/15 05:49

> そのやり方が調べてもわからず。 組み込み系で、ターゲットボードのハードウェア仕様も千差万別な中、要求をピッタリ満たすアセンブリ言語のコードなど検索してヒットするはずが無いですね。本質問を読んだ閲覧者、回答者にとっても同じです。既にいくつもコメントをいただいている通り、自分で今、必要なアセンブリ言語を学び、最低限のコードを書けるようになるのが一番の近道です。それくらいになれば分からないときの質問の仕方もまた変わってくるはずです。
Zuishin

2022/12/15 09:11

chatGPT に聞いたところ、以下の回答を得ました。 このコードの意図がよくわかりませんが、大抵の場合、初期化ルーチンへのジャンプは「jmp」命令を使用することで実現できます。例えば、0x08000000の初期化ルーチンへジャンプする場合は次のように書けます。 Copy code jmp 0x08000000 この命令を使用することで、プログラムの実行が0x08000000の初期化ルーチンへと移ることになります。 また、初期化ルーチンへのジャンプ先を切り替える場合は、条件分岐命令(例えば「je」や「jne」など)を使用することで実現できます。例えば、DSWの状態に応じて0x08000000または0x08100000の初期化ルーチンへジャンプする場合は次のように書けます。 Copy code ; DSWの状態をeaxレジスタに読み込む mov eax, DSW ; eaxレジスタの値が0の場合は0x08000000へジャンプ je 0x08000000 ; eaxレジスタの値が0以外の場合は0x08100000へジャンプ jne 0x08100000 このようにして、初期化ルーチンへのジャンプ先を切り替えることができます。
tmp

2022/12/16 08:36

teratailに、AIが生成した文章について、注意事項?最近追加されたみたいですね。 chatGPTと、AIの明記はしていますが、 AIが生成した回答は、「投稿する場合は、内容が正しいかを精査してください。」とあります。 このかかれている内容もmov命令でフラグが変化するCPUもあるけど、RXマイコンは、フラグが変化しませんし、正しいかを精査しているようにみえません。 本題にもどり、 ところでメモリが貧租な4bitや8bitのマイコンではあるまいし、なぜ、アセンブリ言語なんでしょうか? ブート部をいじるにしても大抵はメーカーが用意したサンプルがあり、そこを少しいじるだけで済むはずです。いじるだけなら全部理解しなくても必要な個所だけ調べれば十分かとおもいます。 それでもアセンブリ言語つかうなら、 まずは、そのCPUについて理解しましょう。 「命令セットアーキテクチャ ユーザーズマニュアル ソフトウェア編」等を内容が理解できなくても、最後まで目を通して、見たかどうかだけぐらいの記憶で十分です。試験ではないのですから、あとでもう一度読むことも可能です。それも時間がなければ、目次だけでも確認しましょう。 で、アセンブリ言語へ
Zuishin

2022/12/16 15:24

> AIが生成した回答は、「投稿する場合は、内容が正しいかを精査してください。」とあります。 よく読んでください。 https://blog.teratail.com/entry/ai-terms > ですので、AIが生成したことを明記していただくことで、回答を100%信頼することなく、内容の精査を行っていただきたく思っております。 精査するのは質問者です。
tmp

2022/12/16 16:51

確かに、そのリンク先をみたら質問者にも、みえますね。 私は、こっちをみてしまったので https://teratail.com/help#about-ai-terms AIが生成した回答・コメントについて 「投稿する場合は、内容が正しいかを精査してください。」 投稿するときに、精査できるのは、回答者だけだとおもってしまいます。 サイトの隅々まで読まずに、決めつけて指摘したことは、すいませんでした。
jimbe

2022/12/19 04:35

質問・回答・コメントのどれであれ、責任を負うのは書いた人間でしょうね。
guest

回答2

0

自己解決

自分でC言語で書いて解決しました。
ありがとうございました。

投稿2022/12/22 01:41

Mr.kyousuke

総合スコア13

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

たんにDSWの状態をif文で判定して分岐するだけ、ですね

投稿2022/12/14 15:55

y_waiwai

総合スコア88171

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Mr.kyousuke

2022/12/15 00:37

それをスタートアップルーチンのアセンブリで書きたいのですが、分からず困っています。
y_waiwai

2022/12/15 10:44

まずはアセンブル言語を勉強しましょう。 RXのソフトウエアマニュアルは無料で公開されてますんで、それを読んで勉強しましょう。 あんがいかんたんなもんですよ
Mr.kyousuke

2022/12/19 05:16

以下で、SWの値を読む(P01の値)ところはどのように書いたらいいのでしょうか? SWの値を読む(P01の値) (ポート入力データレジスタ(PIDR)、PORT1.PIDR 0008 C041h) cmp DSWの値, 1 jle .L2 mov.l #__INIT, r1 ; RAMへジャンプ準備 and #000FFFFFh, r1 ; or #08000000h, r1 ; jmp r1 ; .L2: mov.l #__INIT, r1 ; and #000FFFFFh, r1 ; or #08100000h, r1 ; jmp r1 ;
Mr.kyousuke

2022/12/19 05:16

回答ありがとうございます
Mr.kyousuke

2022/12/19 05:17

読みにくく書いてしまいました。アセンブリの内容は質問文に追記してあります。 よろしくお願いします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問