1

最初に、ここで完全に無茶をしてしまったことをお詫びします。アセンブリ言語は私にとってまったく異なる分野ですが、学びたいと思っています。

私はBaking Piをフォローしていて、最初のレッスンに取り組んでいます。私は Mac (Mountain Lion) を使用していますが、これを仕事で使用しているため、iOS SDK と共に Xcode をインストールしています。iOS SDK は、ARM 用に既にクロスコンパイルされています。

基本的なオープニング チュートリアルをアセンブルしようとすると、すぐに構文エラーが発生します。そのため、明らかに、OS X に同梱されているアセンブラは、armv6 をアセンブルできますが、わずかに異なる構文が必要です。違いが何であるかを知るために、誰かが私を正しい場所に向けることができますか?

私が今直面している問題は、Raspberry Pi の LED をオンにするだけの非常に基本的なコードにあります。

/* -*- Baking Pi tutorial from cam.ac.uk -*-

   This is just the code that is written during the
   'Baking Pi' course from the University of Cambridge,
   likely with some adjustments as I've played around with
   the code for exploratory purposes.

   The addresses of the various hardware components are
   only known from reading the manufacturers' manuals.

   Author:       Chris Corbyn <chris@w3style.co.uk>
   Architecture: armv6
   Hardware:     Raspberry Pi Model B
*/

  /* the initial section appears first in the output */
  .section .init
  /* declare a label for code placement */
  .globl _start

  /* begin main program instructions */
_start:
  /* load address of GPIO controller to register r0 */
  ldr r0,=0x20200000
  /* Explanation: The GPIO controller allocates 4 bytes for
     each 10 pins. There are 54 pins, ~ 6 x 4 = 24 bytes of
     space. Each 4 btes is sub-divided to 3 bits per pin.
     Since we need the 16th pin, we want 3 x 6 bits within
     the correct set of pins. That's 6 x 3 = 18 bits, hence
     the left-shift 18 bits. We then store the bit for the
     address of the pin to the memory location of the GPIO
     controller (from r0), offset by 4 bytes, so that we're
     operating on the second set of 10 pins (10-19).

     This doesn't do anything yet; we're simply 'marking'
     the pin, before we send an instruction to a different
     memory location to turn the pin 'off' (it's backwards)
     thus turning the LED 'on'.
  */

  /* put the number 1 to register r1 */
  mov r1,#1
  /* left-shift the value in r1 by 18 bits */
  lsl r1,#18
  /* store value at r1 to mem r0, offset 4 bytes (pin 16) */
  str r1,[r0,#4]

  /* Explanation: The instruction to turn 'off' a GPIO pin
     involves writing to the memory address 40 bytes into
     the GPIO controller. We write the bit for the pin that
     needs to be turned off. Conversely, offset 28 is used
     to turn a pin 'on' instead of off.
  */

  mov r1,#1
  /* left-shift to just the 16th bit, for the 16th pin */
  lsl r1,#16
  /* store value to r0, offset 40 bytes (turn off) */
  str r1,[r0,#40]

  /* declare a label for a loop (which does nothing) */
loop$:
  /* branch to loop$ label, thus loop forever */
  b loop$

/* -*- end of file -*- */

ショーでコードを組み立てas -arch armv6 source/main.sます:

source/main.s:17:セグメント名の後にカンマが必要です

その行は次のとおりです。

.section .init

末尾のコンマが必要だと思いますが、次のように変更します。

.section .init,

次に、文句を言います:

source/main.s:24: シンボル L0 でサポートされていない再配置

source/main.s:24:未定義のローカル シンボル 0 (0f または 0b)

その行は次のとおりです。

ldr r0,=0x20200000

始める前から迷っています。残念ながら、ダウンロード ページ (YAGARTO) からリンクされているツールは、他の StackOverflow の投稿で読んだことから、実際には OS X では動作しません。バンドルには GCC も含まれているようですが、Xcode のインストールとそれに同梱されている LLVM に影響を与える可能性があるため、インストールしたくありません。

あるいは、GCC ツールチェーン全体を伴わずに armv6 アセンブラーをインストールできれば (すでに GCC + LLVM を持っています)、それも同様に機能します。Homebrewには何かありますか?私はおそらく間違ったことをグーグルで調べています。

編集 | 私が使用している特定のアセンブラーは、「Apple Inc バージョン cctools-839、GNU アセンブラー バージョン 1.38」として報告されます。

編集2 | -qLLVM アセンブラを使用するフラグがあります。これにより、はるかに有用なエラーが発生します。

source/main.s:17:17: error: unexpected token in '.section' directive
  .section .init
                ^
source/main.s:24:10: error: unexpected token in operand
  ldr r0,=0x20200000
         ^
4

0 に答える 0