LINUX.ORG.RU

Не удается скомпилировать код а asm вставкой

 , , ,


2

3

В теме Как включить графику или хотя бы текстовый цветной режим? установил QEMU ARM64. Там Debian 10, и есть gcc 8.3

Есть пример: http://www.ethernut.de/en/documents/arm-inline-asm.html

Есть простая программа:

#include <stdio.h>
int main()
{
printf("test\n");
asm("mov r0, r0");
}
При компиляции gcc test.c -o test пишет: operand 1 must be an integer register. Жалуется на строку mov r0, r0. Она же из примера взята, что ему не нравится? Пробовал r20, r30, всегда один ответ.

Ответ на: комментарий от anonymous

Можно попробовать. Просто я рассчитываю что это штатная функция и судя по статьям в интернете это 100% рабочий подход то что я сделал в примере. Пока не улавливаю суть моей ошибки. gcc компилятор 100% рабочий и без вставки дает работающий бинарь.

Знаю что часть регистров системные, а часть резервирована компилятором. Может надо явно как то высвобождать диапазон, хотя как бы тогда библиотеки работали, хотя может это не релевантно, я не спец...

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от seiken

Нет, но я в курсе что бывают разные синтаксисы. Странно что в примерах показывают именно такой. В самом деле, может отказались, но сомнительно, и мне казалось для ARM никогда не было такой проблемы...

Но с asm(«nop»); код прекрасно собрался и работает.

I-Love-Microsoft ★★★★★ ()

Я в асме ни бум бум, Чёт интересно стало загуглил https://ru.wikipedia.org/wiki/AT%26T-%D1%81%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%81

https://ru.wikipedia.org/wiki/%D0%A0%D0%B5%D0%B3%D0%B8%D1%81%D1%82%D1%80_%D0%BF%D1%80%D0%BE%D1%86%D0%B5%D1%81%D1%81%D0%BE%D1%80%D0%B0

https://gist.github.com/mishurov/6bcf04df329973c15044

http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

#include <stdio.h>
int main()
{
  printf("test\n");
  asm("mov %r8d,%r9d"); 
}

Собралося и робит, регистры нужны явной размерности, movX тоже разный с постфиксами типа movl для лонга.

А просто r0 r100500 тупа нету в AT&T вернее там целый блок их но они разной разрядности и уроде как когда говорят и пишут r0 r1 r2 я так понимаю имеют в виду просто регистр в машинное слово не уточняя разрядности . Я так понял

LINUX-ORG-RU ()
Ответ на: комментарий от I-Love-Microsoft

Никаких. Ойййййййй я же на x86. Сорян, искать AT&T asm ARM особенности какие то что-ли я фиг знаю :(

Вот тут ещё инфа https://azeria-labs.com/arm-data-types-and-registers-part-2/

LINUX-ORG-RU ()
Последнее исправление: LINUX-ORG-RU (всего исправлений: 1)
Ответ на: комментарий от LINUX-ORG-RU

Факи, факи. Что-бы не плодить тем, киньте в руки чтиво максимально для дошколят по asm. Было бы идеально что бы для gcc и описание некого набора который есть тупо везде, должно же быть некий универсальный набор команд который есть тупо везде в пределах одного синтаксиса. Чёт интересно стало немножко. Везде понаписано много, но про одно и тоже с виду пишут по разному. Путаница кака-то

LINUX-ORG-RU ()
Ответ на: комментарий от LINUX-ORG-RU

Не понял про то чтобы везде было. Для каждой архитектуры свой ассемблер. Но про Intel(x86 и x64) вот отличная книга: https://doc.lagout.org/programmation/asm/Modern X86 Assembly Language Program...

Рассмотрено всё от основ до AVX2

fsb4000 ★★★ ()
Последнее исправление: fsb4000 (всего исправлений: 1)

All samples had been tested with GCC version 4,

QEMU ARM64

Она же из примера взята, что ему не нравится?

Эм.., так подожди, пример там кажется вообще про Generic ARM, а не AArch64. Какой ARMv8a во времена GCC 4, хех.

Ну и регистры r0, вместо x0 как бы намекают…

Найди нормальный пример для AArch64, а не пример из 2012 года.

EXL ★★★★★ ()
Ответ на: комментарий от EXL

Ну и регистры r0, вместо x0 как бы намекают…

На что намекают? https://wiki.cdot.senecacollege.ca/wiki/Aarch64_Register_and_Instruction_Quic...

The aarch64 registers are named: r0 through r30 - to refer generally to the registers x0 through x30 - for 64-bit-wide access (same registers) w0 through w30 - for 32-bit-wide access

Есть и r0-r30, есть и x0 w0. Так что r0 не криминал. Тогда вопрос - пащиму?

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от fsb4000

Кстати, заменил r на x и примеры отсюда http://www.cse.uaa.alaska.edu/~ssiewert/a225_doc/ARM_ASM_EXAMPLES-from-UT.pdf прекрасно компилятся через обычный asm в коде на Си, результат правильный. Но переменные должны быть глобальные, не в стеке.

I-Love-Microsoft ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

Вот ещё какой совет. Если знаешь плюсишку, то можешь запросто генерировать себе примеры ассемблера на арме.

1. Пишешь код на C или C++

2. Вставляешь такую команду:

g++ -Ofast -std=gnu++2a -c -S main.cpp -o - | c++filt | grep -vE '\s+\.' > main.asm

И потом смотришь код в main.asm

Пример

// main.cpp
int sum(int a, int b)
{
	return a + b;
}

Создаёт такой файл(5 строк):

sum(int, int):
.LFB0:
	add	w0, w0, w1
	ret
.LFE0:

fsb4000 ★★★ ()
Ответ на: комментарий от I-Love-Microsoft

На что намекают?

На то, что этот код должен собираться не gcc-aarm64-*.

Есть и r0-r30, есть и x0 w0. Так что r0 не криминал.

Используй официальную документацию ARM, а не какие-то странные и нагугленные примеры:

https://static.docs.arm.com/100898/0100/the_a64_Instruction_set_100898_0100.pdf

EXL ★★★★★ ()
Ответ на: комментарий от I-Love-Microsoft

Есть возможность собрать 32-битную вариацию? Указав -m32 или чето типа этого?

Собирать код с помощью armv7a-linux-gnueabi или arm-linux-gnueabi, вместо aarch64-linux-gnueabi.

EXL ★★★★★ ()
Ответ на: комментарий от fsb4000

Еще такая проблема. Оно отказывается компилировать код с инструкциями, содержащими префикс. MOV может а MOVS или MOVLT уже нет. Что делать? Какие-то опции gcc задать, какую то строку добавить в первую asm-вставку? Яндексогугление не помогло. @EXL

I-Love-Microsoft ★★★★★ ()