Сборка двоичного файла Android ELF с помощью nasm?

#android #arm #nasm

#Android #рука #nasm

Вопрос:

Я пытаюсь написать какой-нибудь ассемблерный код для Android. Обычно я бы обошелся без nasm , но, похоже, это вообще не поддерживает Android (ARM) :

 valid output formats for -f are (`*' denotes default):
  * bin       flat-form binary files (e.g. DOS .COM, .SYS)
    ith       Intel hex
    srec      Motorola S-records
    aout      Linux a.out object files
    aoutb     NetBSD/FreeBSD a.out object files
    coff      COFF (i386) object files (e.g. DJGPP for DOS)
    elf32     ELF32 (i386) object files (e.g. Linux)
    elf64     ELF64 (x86_64) object files (e.g. Linux)
    elfx32    ELFX32 (x86_64) object files (e.g. Linux)
    as86      Linux as86 (bin86 version 0.3) object files
    obj       MS-DOS 16-bit/32-bit OMF object files
    win32     Microsoft Win32 (i386) object files
    win64     Microsoft Win64 (x86-64) object files
    rdf       Relocatable Dynamic Object File Format v2.0
    ieee      IEEE-695 (LADsoft variant) object file format
    macho32   NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (i386) object files
    macho64   NeXTstep/OpenStep/Rhapsody/Darwin/MacOS X (x86_64) object files
    dbg       Trace of all info passed to output stage
    elf       ELF (short name for ELF32)
    macho     MACHO (short name for MACHO32)
    win       WIN (short name for WIN32)
 

Кажется, ни один из них не связан с ARM, я не прав?

Комментарии:

1. Я процитирую руководство по NASM: «Сетевой ассемблер NASM — это ассемблер 80×86 и x86-64 , предназначенный для мобильности и модульности». Вам придется использовать ассемблер ARM, подобный тому, который входит в состав Android NDK.

2. Но вы правы в одном смысле: x86-64 и IA-32 — это две совершенно разные архитектуры, так почему бы не третья? NASM может поддерживать оба варианта только потому, что они настолько обратно совместимы. Однако другие варианты — это просто выбор контейнера (ELF, Mach-O, PE, …). Кажется, что GNU это as делает?

3. Также смотрите Сравнение ассемблеров в Википедии.

Ответ №1:

Вы правы: NASM не поддерживает ARM.

Существует очень простая причина: сборка ARM не имеет ничего общего с любой сборкой x86. Сборка связана с аппаратной архитектурой, для которой она предназначена. Инструкции по сборке — это мнемоника для фактического набора команд процессора, а набор команд ARM не имеет ничего общего с инструкцией x86, поскольку архитектура ARM не совместима с x86.

Любой ассемблерный код, написанный для x86, не может быть использован на ARM. Именно поэтому были разработаны языки более высокого уровня (такие как C).

Ответ №2:

NASM поддерживает только архитектуры x86 / 64. ARM — это совершенно другая архитектура. Список, на который вы ссылаетесь, представляет собой список форматов файлов, в которые NASM способен сохранять собранный код x86 / 64.