アセンブラソースの分割はどうやってやるのでしょうか? 昨日、PICから発光ダイオードの点滅のプログラム(A.asm)を書いて、動きました。喜んでおります(^^/。で、コードが長い(たいした事はないですが…)ので、Waitのサブルーチンを B.asmに移動したいのですが、やり方がわかりません。MPLABでB.asmを追加してビルドしても、Labels must be defined in a code or data section when making an object file

というエラーが出ます。ORGとかいうのを使うのでしょうか? アセンブラ歴は数日の初心者です。よろしくお願いします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:--
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答14件)

id:aki73ix No.1

回答回数5224ベストアンサー獲得回数27

ポイント5pt

アセンブラにもIDE(統合環境)によってはマクロ命令・擬似命令・アセンブル指示命令が存在します

例えば、

INCLUDE C.ASM

と言う文を入れると

他のファイルをインクルードできたりします

ORGはプログラムがアドレスのどこから始まるかを指定する時に使います

http://member.nifty.ne.jp/nagisaelec/na80form.html

@nifty:@homepage:移転のお知らせ

参考

id:nekomilk

プロジェクトに追加して、増やしてく方法はないですか?

2004/08/01 14:58:52
id:youkan_ni_ocha No.2

回答回数379ベストアンサー獲得回数0

ポイント5pt

さがしてて、あれっとおもったんですが

CCSのCコンパイラだとできるんですけど。

アセンブラだとできないんじゃなかったでしたっけ。ORGは割りこみの時なんで違うと思います。

id:nekomilk

みなさん、1ファイルにずらーーーっと書いているのかなぁ? (^^;

2004/08/01 15:04:48
id:ykanzaki No.3

回答回数267ベストアンサー獲得回数8

ポイント5pt

http://www.hatena.ne.jp/1091338800#

アセンブラソースの分割はどうやってやるのでしょうか? 昨日、PICから発光ダイオードの点滅のプログラム(A.asm)を書いて、動きました。喜んでおります(^^/。で、コードが長.. - 人力検索はてな

プログラムの分割を考える前に,同一プログラムの中でそれおぞれの処理をブロック毎に追加して書いていって同でしょうか.そうするとアセンブラのプログラムに慣れてきて,今書いている事がどういうことか,またORGの意味も良く分かり,サブルーチンのCallも苦にならなくなります.それまでは簡単なプログラム順番に追加していってはどうでしょうか

id:nekomilk

別ファイルのサブルーチンのコールがやりたいのです。

2004/08/01 15:06:22
id:aki73ix No.4

回答回数5224ベストアンサー獲得回数27

ポイント25pt

URLはダミーです

>プロジェクトに追加して、増やしてく方法はないですか?

プロジェクトに直接追加した場合は、共通の変数などを互いにさっき説明した INCLUDE指示命令でインクルードしてやらないとラベルが見つからないと言うエラーが出ます

プロジェクトに追加することで、1つ1つのファイルをコンパイルするのですが、変数についてはINCLUDEでヘッダファイルを読み込んでやらないといけないのはC言語と同じようです

アセンブラの場合はインクルードファイルを INCと言う名前にすることが多いようですね

プロジェクトに追加を選んだ時に、アセンブラファイルがない場合は、ファイルの種類を選ぶとアセンブラが出てくる場合がありますがいかがでしょうか?

id:nekomilk

なるほど。なるほど。ありがとうございます。

けど、エラーはまだおさまりません・・・。 

2004/08/01 22:48:46
id:moritamasahiro No.5

回答回数190ベストアンサー獲得回数0

ポイント5pt

http://www5b.biglobe.ne.jp/~kuma3/html/homemade/pic_soft.html

PICを使った電子工作2(製作編)

MPLABではそれほどおおきなプログラムは組んでいないので自分で別ファイルのサブルーチンをコールしたことはないのですが、ここのURLで若干触れられています。

id:nekomilk

Skipping link step. The project contains no linker script.というエラーがでます。うーむ。

2004/08/02 21:24:52
id:virus No.6

回答回数183ベストアンサー獲得回数1

ポイント5pt

http://www.hatena.ne.jp/1091338800

アセンブラソースの分割はどうやってやるのでしょうか? 昨日、PICから発光ダイオードの点滅のプログラム(A.asm)を書いて、動きました。喜んでおります(^^/。で、コードが長.. - 人力検索はてな

アセンブラと言われても・・・CPU により、ソフトメーカにより千差万別なので、一般的な話ですが・・・

プロジェクト云々と言う話が出てるので、分割アセンブリ可能なソフトだと思いますが、やり方は二つあります。

一つは既出の include 文を使う方法。これは単にソースを分割してるだけなので、たいていのアセンブラで可能です。ただし、include 文(ないし同様のもの)をサポートしてる必要があります。

もう一つは、サブルーティン側でその名前を global とか export とか public 宣言します(どういう表記かはアセンブラによって異なりますので、具体的なソフト名がわからないと何も言えない)。

一方、呼び出す側でもその名前を、import とか global とか public とか宣言します。

どちらの宣言についても、code や data 等の同じ名称のセグメント内で宣言しないとエラーが出るのが一般的です。

具体的なことは MPLAB だけでどんなアセンブラかわかる人にお任せします(笑

id:nekomilk

うーん。アセンブラ自体がよくわかってないので…。(^^;

2004/08/02 21:25:57
id:virus No.7

回答回数183ベストアンサー獲得回数1

ポイント5pt

http://www.microchip.co.jp/tools.html

マイクロチップ・テクノロジー・ジャパン 開発ツール

MPLAB ってこれですか?

ざっとヘルプを見たところでは、サブルーティンの宣言側は global でサブルーティン名を公開し、使う側は extern でその名前を宣言してから call する、だと思います。

id:nekomilk

それです。それです。

ヘルプはどこにありますか?

2004/08/02 21:28:41
id:marlene7196 No.8

回答回数144ベストアンサー獲得回数0

ポイント5pt

分割可能ですね。リンカーを使います

---

プログラムを作っていると、長すぎるファイルを分割したい場合があります。そのような場合には、分割アセンブルという方法を使います。ソースを分割してアセンブルして、リンクでオブジェクトファイルを統合します。

id:nekomilk

おー。できるという事まではわかりました。

2004/08/02 21:30:39
id:csunday No.9

回答回数5ベストアンサー獲得回数0

ポイント5pt

http://support.microsoft.com/default.aspx?scid=kb;JA;73407

MASM から C 関数を呼び出すために、 PROTO と呼び出すを使用します。

(MASMしか使ったことが無いのですが)

MASMならENTRNというのを使います。

URLの中の「サンプル コード 1」で丁度

printf

等をENTRNしてます。

C言語のexternと同じです。

id:nekomilk

うーむ。うまくいかない…。

2004/08/02 21:32:51
id:j-kagawa No.10

回答回数3ベストアンサー獲得回数0

ポイント5pt

↑ダミーです

id:j-kagawa No.11

回答回数3ベストアンサー獲得回数0

ポイント5pt

先ず、ソースコード全体を、主プログラムと副プログラム(サブプロシージャ)に上手に整理分割し、見通しを良くしましょう。機能単位で上手に分割して、それぞれ別のソースファイルに分割すると良いでしょう。各ファイルに共通の定義ヘッダ、共通変数などは、別ファイルにして、それぞれのソースファイルからインクルードしましょう。変数とプロシージャのパブリック宣言なども忘れずに。リンカーがオブジェクトファイルをリンクするときに、シンボル情報を元に、実行ファイルを正しく生成してくれるはずです。質問者の開発環境が確認できず、不適切な点もあり、済みません。アセンブリ歴25年の初心者ですが、ご不明な点などあれば、私で宜しければ追記しますので、宜しくお願い申し上げます。<m(__)m>

id:nekomilk

うぉっ。25年ですか…。すごい…。

externとpublicというのを使えばよさそうなのですが

環境が違うと記述が違うのですね…。

まだうまくいってません…。(^^;

2004/08/02 21:35:15
id:tmang No.12

回答回数19ベストアンサー獲得回数0

ポイント85pt

URLはダミーです

基本は

メインのソースファイル(そのサブルーチンを呼んでいるファイル)に

外部参照(extern)命令をおき

サブルーチンファイルに外部公開命令(public)をおきます

例としてはMASMの場合ですが

******************************************************************

メインのソース

extern sub_routine:near

CODEsegment

mainproc

call sub_routine

mainendp

CODEends

******************************************************************

サブルーチンソース

public sub_routine

CODEsegment

sub_routineproc

...........

sub_routineendp

CODEends

*******************************************************************

お使いのアセンブラにもこれと同じような命令があるはずです

segment と ends はセグメント(CODE)指定命令です

参考になればいいですが・・・

id:nekomilk

うーん。同様の機能を行う記述がわからないです。(X_X)

2004/08/02 21:39:22
id:tmang No.13

回答回数19ベストアンサー獲得回数0

ポイント5pt

このPDFをダウンロードしてみました。

PUBLICの代わりにMPASMではGLOBAL宣言が必要なようです。

このPDFがMPASMのドキュメントでリンカーとライブラリアンのドキュメントにもなっているようです。

このPDFをダウンされることをお勧めします。頑張ってください。

id:nekomilk

うーん。リンカースクリプトが無いと怒られてしまいます…。

分割アセンブルはハードルが高いのかなぁ。

2004/08/06 09:59:21
id:t-tmang No.14

回答回数1ベストアンサー獲得回数0

ポイント5pt

http://www.apple.com/jp/powermac/

アップル - Mac Pro

3回目なのではじかれてしまいました

別IDで登録しますことをご了承ください。

そこまで行けばあともう少しです!

アセンブルエラーは無くなったわけです^^

現在の状態は、その次、リンクの時点でつまずいているのです。

ここで、アセンブラの原理を簡単に説明します。(ご存知でしたらごめんなさい)

まず、ソースをアセンブラに掛けますと、ソースに問題が無ければ

ソースの数だけオブジェクトファイルが出来ます。

この状態は実行できる状態ではなく、ただバイナリのある意味、データです。

その、各々のデーターを結合し、シンボルラベルを解読し、一つにまとめ、

意味あるコードに変換すのがリンカーなのです。

IDEはそれを自動で順々こなしてくれるのです。

ええと、milknekoさんがIDEをインストールしたディレクトリの中に

MCHIP_Tools¥LKRというディレクトリがあるはずです。

その中にmilknekoさんがターゲットにしているデバイス用の

リンカースクリプトファイルがあるのでそれをプロジェクトの

Linker Scriptsにaddすれば。通ると思います^^

環境を入れて実際に試したので間違いないと思います^^

頑張って下さい。

id:nekomilk

おぉ!! リンクが通りました。

ただ、デバッグ実行するとどこのブレークポイントにもとまりませんでした。

とりあえず、リンクは通ったので、この質問はクローズします。

みなさん、ありがとうございました!!

2004/08/08 10:00:24
  • id:virus
    ヘルプ

    #二回しか回答出来ないと言うのは何とかしてほしい>>はてな

    ヘルプですが、IDEの Help メニューの Topics で MPASM Assember を選べば表示されます。
    この Directives に EXTERN 等の使い方などの記述があります。
    デバッガーでも苦労されてるようですが、同様にしてヘルプを読めばなんとかなるんじゃないでしょうか(^^ゞ
    英語と言っても、この手の英語は用語さえ憶えてしまえば、複雑なことは何も書いてないので恐れるに足りず(^^)

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません