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, всегда один ответ.

★★★★★

Последнее исправление: I-Love-Microsoft (всего исправлений: 1)

Например, вместо говновставки напиши отдельную функцию на асме в отдельном асм файле.

anonymous
()
Ответ на: комментарий от 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 ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Попробовал

asm("mov %r8d,%r9d");
И ровно такая же ошибка, шозанафиг?! Тогда какие аргументы при сборке, компиляции?

I-Love-Microsoft ★★★★★
() автор топика
Ответ на: комментарий от 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)

На 32-битном ARM так работает:

#include <stdio.h>

int
main()
{
        printf("test\n");
        __asm ("mov %r0, %r0");
        return 0;
}
Deleted
()
Ответ на: комментарий от 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)

ARM64

asm(«mov x0, x0»);

либо

asm(«mov w0, w0»);

Разницу сам нагуглишь

anonymous
()

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 ★★★★★
()
Ответ на: комментарий от EXL

Ясно, понял. Посмотрел, вроде меня и aarch64 устраивает, останусь на нем.

I-Love-Microsoft ★★★★★
() автор топика
28 ноября 2019 г.
Ответ на: комментарий от fsb4000

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

I-Love-Microsoft ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.