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

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

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

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

Raspbian

Raspbianは、DebianベースのRaspberry Pi用ディストリビューション。ハードウェア浮動小数点演算を有効にすることが可能で、Webブラウズなどの速度を向上できます。

Q&A

解決済

3回答

576閲覧

リンクができたが実行できない

yukkuri

総合スコア624

アセンブリ言語

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

Raspbian

Raspbianは、DebianベースのRaspberry Pi用ディストリビューション。ハードウェア浮動小数点演算を有効にすることが可能で、Webブラウズなどの速度を向上できます。

0グッド

0クリップ

投稿2018/11/22 11:27

前提・実現したいこと

現在、アセンブリ言語を1から学習しています。
ソースを書いて、なんとかリンクまで終わりましたが、実行時にエラーが発生してしまいます。

発生している問題・エラーメッセージ

Illegal instruction

該当のソースコード

.text @ text セクション .align 2 .global _start @ 必須 /* 定数への名前付け */ sys_write = 0x900004 @write システムコール sys_exit = 0x900001 @exit システムコール _start: @このラベルから実行開始 mov r3, #5 @ 5回繰り返す 1: ldr r1, msg @ 文字列先頭アドレス mov r0, #1 @ 標準出力( fd = 1 )を指定 ldr r2, msg_sz @ 出力データの長さ(byte) swi #sys_write subs r3, r3, #1 @ カウンタを更新 bne 1b @ 後方のローカルラベルへ /* 終了時実行 */ mov r0, #0 @ 終了コード0 swi #sys_exit @ 終了 /* 書き換え不要定数 -> text セクションに */ msg: .long msg0 @ 文字列格納アドレス msg_sz: .long msg_sz0 @文字列の長さ格納アドレス .data @ data セクション .align 2 /* 初期化が必要なデータを置く */ msg0: .asciz "hello world\n" .align 2 @ 4バイト境界に設定 msg_sz0 = . - msg0 @ 文字列の長さを計算 data1: .hword 12345 .bss @ bss セクション .align 2 /* 初期化が必要なデータを置く */ data: .long 0 @ 今回不使用

試したこと

https://qiita.com/edo_m18/items/a7c747c5bed600dca977
https://www.mztn.org/slasm/arm07.html

上のサイトを見て作っています。
Raspberry pi なので、ARMアーキテクチャで間違いないと思います。

補足情報(FW/ツールのバージョンなど)

アセンブラは上のサイトと同じas、ldです。
役に立つがわかりませんが

as

1GNU アセンブラ (GNU Binutils for Raspbian) 2.28 2Copyright (C) 2017 Free Software Foundation, Inc. 3This program is free software; you may redistribute it under the terms of 4the GNU General Public License version 3 or later. 5This program has absolutely no warranty.

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

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

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

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

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

guest

回答3

0

解決されていますが折角調べが付いたので一応書いておきますと、
どうやらシステムコールの呼び方がその参考のLinux Zaurus環境とRaspbianで異なるようです。
Zaurusではswi命令の引数にシステムコール番号を入れていますが、Raspbianでは、「追記:参考にしたサイト」や下記のサイトにあるようにシステムコール番号をr7レジスタに入れswi(=svc)の引数は0とするようです。
それでwriteが無視されて何も出力されず、exitが無視されて終了せずにその先のリテラル領域を命令として実行したためにIllegal instructionが発生したということです。
システムコールの呼び方の変更と、以下のサイトを参考にr7・lrを退避するpush・popを加えて、正しく動作しました。
https://thinkingeek.com/2014/05/24/arm-assembler-raspberry-pi-chapter-19/

投稿2018/11/26 16:45

ikadzuchi

総合スコア3047

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

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

0

自己解決

結局、別サイトを参考にし、アセンブラを実行できる、というのはわかりました。
もう少し、勉強をしてからやり直したいと思います。
y_waiwaiさん、ありがとうございました。もう少し、PC自体の勉強もしてみます。

追記:参考にしたサイト
https://lowreal.net/2014/02/25/1

投稿2018/11/23 00:16

編集2018/11/23 00:17
yukkuri

総合スコア624

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

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

0

そのコードのアドレスの割当はどうなってるかとか、どこからどのように実行させたかとかツッコミどころはいろいろありますが、そういうめんどくさいことは横に置いときます
提示されたコードは読んでませんし、回答するつもりはありません。
こういう場合のデバッグ法をつらつら書いときます

  1. まずは、GPIOのピンの一つをHighにしたりLowにしたりするコードを書きましょう。それをループにして、High,Lowを繰り返す単純なコードを組みます。オシロでそのポートを見れば正常に動作してるかは確認できます。
  2. 次に、シリアルポートから文字列出力させるコードを組みます。そしてPCでそれを受信できる環境を整えましょう。この程度なら簡単にできるでしょう。(シリアル受信は必要ないです)
  3. そして、あなたが組みたいというコードを組むことです。要所要所に確認用のメッセージを出力するコードを置きます。PCでそれを見て正常に動作しているかどうかを確認できます

がんばってください

投稿2018/11/22 12:08

y_waiwai

総合スコア87719

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

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

ikadzuchi

2018/11/22 18:56

> 提示されたコードは読んでません OS上で文字表示してることすら読まねえなら回答すんなよボケ。
y_waiwai

2018/11/22 22:30

そのOS上で文字表示してるということさえ動かない、という場合はどうしましょう。 動くはず、で動くなら何も苦労はないんですけどねえ。 #自分は何もしないのに他人の批判は楽でいいですねえ。オレもそうしたいもんです
ikadzuchi

2018/11/23 07:29

> そのOS上で文字表示してるということさえ動かない、という場合は あなたがどれだけ物を知らないのか分からないのですが、Raspbianは文字を表示できるOSですので、ソースを書いてリンク実行などしている時点で既に文字表示ができていると考えるのが自然です。 その上で、GPIOのピンを制御したりシリアルポートから文字を出力させるには、OS上で文字を表示するより複雑な操作になります。 ある操作が上手く動かない原因を探るためにより複雑な操作をさせるというのはナンセンスです。 > #自分は何もしないのに他人の批判は楽でいいですねえ 価値がマイナスの回答を量産して恥じない神経は楽でいいですね。私もそのような神経を持ちたかったものです。 また、「他人の書いた価値がマイナスの返答を正す」のは「何もしない」ではないと自負しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問