Сборка armv6 в сборке OS X - синтаксические различия?

Во-первых, я прошу прощения за то, что был полным n00b здесь. Язык ассемблера - это совсем другое поле для меня, но я очень хочу учиться.

Я следую вместе с Выпечкой Пи и просто прорабатываю первый урок. Я использую Mac (Mountain Lion), но у меня установлен Xcode с iOS SDK, так как я использую это для работы. IOS SDK уже кросс-компилируется для ARM.

Когда я пытаюсь собрать базовое учебное пособие по открытию, я сразу же получаю синтаксические ошибки, поэтому очевидно, что ассемблер, который поставляется с OS X и может собирать armv6, требует немного другого синтаксиса. Может ли кто-нибудь указать мне правильное место, чтобы узнать, в чем различия?

Проблемы, с которыми я сейчас сталкиваюсь, связаны с этим действительно базовым кодом, который просто включает светодиод Raspberry Pi.

/* -*- 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), на самом деле не работает в OS X, из того, что я читал в других статьях Stackru. Похоже, я также включил GCC в комплект, поэтому я бы предпочел не устанавливать его, так как это может повлиять на мою установку XCode и LLVM, которые поставляются вместе с ним.

В качестве альтернативы, если я могу установить ассемблер armv6 без сопровождающего его всего набора инструментов GCC (у меня уже есть GCC + LLVM), это будет работать так же хорошо. Есть ли что-то в Homebrew? Я, вероятно, прибегаю к помощи неправильных вещей.

РЕДАКТИРОВАТЬ | Конкретный ассемблер, который я использую, сообщает о себе как "Apple Inc версия cctools-839, GNU ассемблер версия 1.38".

РЕДАКТИРОВАТЬ 2 | Есть -q флаг, который заставляет его использовать ассемблер LLVM. Это дает гораздо больше полезных ошибок.

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
         ^

0 ответов

Другие вопросы по тегам