Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler: Linux
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.94/17: Рейтинг темы: голосов - 17, средняя оценка - 4.94
pcmax
330 / 38 / 5
Регистрация: 29.01.2018
Сообщений: 797
1

Раздельная компиляция

22.10.2019, 18:15. Просмотров 3186. Ответов 32

помогите пожалуйста понять как надо правильно сделать.

первый файл под названием f.s


Assembler
1
2
3
4
5
6
7
foo:
 
mov $3 , %r9
 
inc %r0
 
ret



второй файл f2.s
Assembler
1
2
3
4
5
6
7
8
9
10
11
.section .text
 
.global _start
_start:
 
call foo
 
 
 
mov $1, %rax
int $0x80


Bash
1
2
gcc f.s f2.s -c
ld f.o f2.o -o start
что исправить ,чтобы сработало ?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.10.2019, 18:15
Ответы с готовыми решениями:

раздельная компиляция
Вот есть три файла: заголовочный файл с классом (.h), файл с реализацией методов класса (.cpp), и...

Раздельная компиляция
Пусть есть программа, которая состоит из 2 файлов. 1 файл: основной, там где main 2 файл:...

Раздельная компиляция
Как в с# сделать раздельную компиляцию. Спасибо.

Раздельная компиляция
В Гугле не забанен,нашел описание самого принципа,но конкретных примеров не нашел. Вопросы вот...

Раздельная компиляция
Здравствуйте, я перечитал на форуме информацию по этой теме, но пока что не сумел разобраться. У...

32
pcmax
330 / 38 / 5
Регистрация: 29.01.2018
Сообщений: 797
23.10.2019, 21:44  [ТС] 2
ну помогите уже уважаемые форумчане
0
Vourhey
Почетный модератор
6729 / 2415 / 216
Регистрация: 29.07.2006
Сообщений: 12,992
23.10.2019, 21:54 3
Цитата Сообщение от pcmax Посмотреть сообщение
ну помогите уже уважаемые форумчане
Людям будет проще, если ты напишешь, что ты конкретно сделать хочешь. Из написанного кода не понятна ни цель, ни средства.
Цитата Сообщение от pcmax Посмотреть сообщение
mov $1, %rax
int $0x80
На x64 нужно использовать syscall для системных вызовов, а не прерывание 80. И номера системных вызовов там отличаются, если вдруг здесь exit подразумевался. Читай книги, уже который раз говорю.
3
pcmax
330 / 38 / 5
Регистрация: 29.01.2018
Сообщений: 797
24.10.2019, 17:45  [ТС] 4
ребята, syscall про него все верно. так пишут везде.

но давайте просто разберемся как мне вызвать фунцию foo написанную в отдельном файле на Gas из другой программы написанной также на GAs. любой пример пожалуйста
0
24.10.2019, 17:45
Vourhey
Почетный модератор
6729 / 2415 / 216
Регистрация: 29.07.2006
Сообщений: 12,992
24.10.2019, 17:59 5
pcmax, хорошо. Базовый вопрос: как ты определяешь вызвалась функция или нет.
0
pcmax
330 / 38 / 5
Регистрация: 29.01.2018
Сообщений: 797
24.10.2019, 19:00  [ТС] 6
как я могу определять, если не знаю,как ее даже вызвать. вы пожалуйста не забывайте ,что я не программист.


просто помогите вызвать функцию правильно написанную на GAS в другом файле программы также на GAS
0
Vourhey
Почетный модератор
6729 / 2415 / 216
Регистрация: 29.07.2006
Сообщений: 12,992
24.10.2019, 19:23 7
Цитата Сообщение от pcmax Посмотреть сообщение
как я могу определять, если не знаю,как ее даже вызвать
Хорошо. Тогда твой код - верный, и вызывает функцию foo. Что ты с этим будешь делать дальше?
Цитата Сообщение от pcmax Посмотреть сообщение
вы пожалуйста не забывайте ,что я не программист.
Зачем же ты код пишешь, если не программист?

Добавлено через 3 минуты
Цитата Сообщение от pcmax Посмотреть сообщение
как я могу определять, если не знаю,как ее даже вызвать.
По сути, для тебя вызов функции сейчас - это кот Шредингера. Ты ее вызвал. Но ты не знаешь об этом. Или ты ее не вызвал. Ты тоже об это не знаешь. От чего тогда вопрос возникает, если никакой разницы в итоге?
2
pcmax
330 / 38 / 5
Регистрация: 29.01.2018
Сообщений: 797
24.10.2019, 19:29  [ТС] 8
слушайте, это сейчас все кто пишут код-программисты. в мои дни, код могли писать обычные пользователи zx spectrum , например, и это было увлечение. это увлечение я сохранил и до этих дней. только вместо basic C++ и Assembler.


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


по Ассемблеру Вам есть чем мне помочь?
1
Vourhey
Почетный модератор
6729 / 2415 / 216
Регистрация: 29.07.2006
Сообщений: 12,992
24.10.2019, 19:39 9
Цитата Сообщение от pcmax Посмотреть сообщение
по Ассемблеру Вам есть чем мне помочь?
Нет, я ничего не знаю, просто фигней страдаю, от скуки маюсь и все такое...
Я не вижу конкретной проблемы в это теме. Напиши функцию, которая что-то делает. Вызови ее. Проверь, что результат, который ты ожидаешь, не тот, который ты получаешь по факту. И вот тогда можно уже что-то обсуждать.

Добавлено через 3 минуты
С точки зрения банальной логики: если я никак не могу убедиться, что функция, которую я написал, вызывается и работает... То и не имеет значения, вызывается по факту функция, или нет. Она же ни на что не влияет и проверить ее никак не могу.
1
ФедосеевПавел
Модератор
4732 / 2633 / 1051
Регистрация: 01.02.2015
Сообщений: 8,613
Записей в блоге: 1
24.10.2019, 19:43 10
Почему бы не предположить, что топикстартер предлагает минимальный тестовый пример, правильность работы которого проверяет в отладчике?

Как понимаю, его интересует раздельная компиляция файлов, составляющих единую программу.
2
Vourhey
Почетный модератор
6729 / 2415 / 216
Регистрация: 29.07.2006
Сообщений: 12,992
24.10.2019, 20:27 11
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Почему бы не предположить, что топикстартер предлагает минимальный тестовый пример, правильность работы которого проверяет в отладчике?
Но он этого не делает. Иначе, бы он написал, что в отладчике call не срабатывает, или что код не компилируется. Но, как я вижу, по самому первому сообщению, проблем с раздельной компиляцией и вызовом никаких нет. Тогда не понимаю, в чем вопрос.
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Как понимаю, его интересует раздельная компиляция файлов, составляющих единую программу.
Точно. Он и привел ее пример в самом начале. Но не сказал, что его не устраивает в собственном примере раздельной компиляции.
0
ФедосеевПавел
Модератор
4732 / 2633 / 1051
Регистрация: 01.02.2015
Сообщений: 8,613
Записей в блоге: 1
24.10.2019, 20:45 12
Надеюсь, теперь pcmax понял, что:
- его код корректный, компилируется, выполняется
- в чём состоит проблема - никому не понятно, раз код правильный
Таким образом, от pcmax требуется уточнение, что в корректном коде его не устраивает.
0
politoto
2230 / 278 / 34
Регистрация: 23.07.2018
Сообщений: 724
Записей в блоге: 1
24.10.2019, 22:24 13
Код, может быть, и абсолютно верный, но у меня первый модуль f.s не ассемблируется:
Bash
1
gcc f.s f2.s -c
Код
f.s: Assembler messages:
f.s:5: Error: bad register name `%r0'
Поэтому один из объектных модулей не создается, и компоновщику пока не с чем связывать.

Bash
1
nm f.o f2.o
Код
nm: 'f.o': Нет такого файла

f2.o:
                 U foo
0000000000000000 T _start
2
pcmax
330 / 38 / 5
Регистрация: 29.01.2018
Сообщений: 797
25.10.2019, 18:31  [ТС] 14
Цитата Сообщение от ФедосеевПавел Посмотреть сообщение
Как понимаю, его интересует раздельная компиляция файлов, составляющих единую программу.

спасибо что поняли.

Добавлено через 1 час 25 минут
Цитата Сообщение от politoto Посмотреть сообщение
Код, может быть, и абсолютно верный, но у меня первый модуль f.s не ассемблируется:

пердложите пожалуйста свой вариант.... я просто хочу вызвать любую функцию написанную в отдельном файле в основном коде. функция и основной код из которого она будет вызвана ,написанны на языке GAS.
0
Vourhey
Почетный модератор
6729 / 2415 / 216
Регистрация: 29.07.2006
Сообщений: 12,992
26.10.2019, 19:06 15
Так какая раздельная компляция, если код одного модуля даже не компилируется?

Добавлено через 1 минуту
Цитата Сообщение от pcmax Посмотреть сообщение
я просто хочу вызвать любую функцию написанную в отдельном файле
В самом начале нужно написать код функции в отдельном файле, который скомпилируется. Еще до "основного" кода.
0
pcmax
330 / 38 / 5
Регистрация: 29.01.2018
Сообщений: 797
26.10.2019, 20:29  [ТС] 16
Цитата Сообщение от Vourhey Посмотреть сообщение
В самом начале нужно написать код функции в отдельном файле, который скомпилируется. Еще до "основного" кода.

вместо того чтобы лепить мне дизлайки, лучше бы написали работающий пример. говорить расплывчато и я умею.


тут одни господа опираясь на маны, заявили в темах 2011 годов,что невозможно вызвать функцию написанную на Nasm в коде на Cи. А вот Politoto дал рабочий пример ,в котором я смог это осуществить. и я порой думаю откуда у них такая репутация высокая? не ужели это все благодаря чтению манов,которые говорят что это невозможно, а на деле возможно еще как?

также один господит вообще не понимая в Assembler долго тыкал меня носом в дерьмо, говоря что он дал уже мне рабочий пример. при этом его пример не мог работать. я это понял, когда Человек,который действительно шарит в Си дал мне правильный пример))))

вобщем долой расплывчатые слова! только рабочие примеры.
если таких нет, то просим идти лесом.
0
politoto
2230 / 278 / 34
Регистрация: 23.07.2018
Сообщений: 724
Записей в блоге: 1
27.10.2019, 09:18 17
Лучший ответ Сообщение было отмечено pcmax как решение

Решение

Цитата Сообщение от pcmax Посмотреть сообщение
лучше бы написали работающий пример. говорить расплывчато и я умею.
Вы и писать расплывчатые примеры умеете неплохо.

Цитата Сообщение от pcmax Посмотреть сообщение
А вот Politoto дал рабочий пример ,в котором я смог это осуществить. и я порой думаю откуда у них такая репутация высокая?
Вы же сами в той теме придумали задачу и сами в ней разобрались. 8)
А репутация высокая у тех, к чьим вопросам и ответам другие пользователи не ленятся писать отзывы, а потом кликать на +1 Спасибо

Проблема, которая у меня возникла с Вашим примером в том, что первый файл не являтся корректным модулем программы, написанном на входном языке gas с теми параметрами и настройками, с которыми я его запускаю.

Добавлено через 24 минуты
Предлагаю начать с абсолютно минимального примера программы из двух файлов, которые успешно ассемблируются раздельно и затем компонуются с помощью GNU binutils.

Затем Вы добавите минимальные изменения в эти два файла, после которых модули все ещё можно будет успешно ассемблировать и создавать соответствующие объектные модули.
Мы обсудим эти изменения, и, если повезёт, сможем понять, что хотите понять Вы.

Bash
1
rm a.out
(На всякий случай)

Bash
1
2
3
4
5
touch первый
touch первый второй
as первый -o один
as второй -o два
nm один два
Код
один:

два:
Bash
1
ld один два
Код
ld: warning: cannot find entry symbol _start; defaulting to 0000000000400040
По умолчанию nm показывает символы в a.out, который мы и создали только что
Bash
1
nm
Код
0000000000601000 A __bss_start
0000000000601000 A _edata
0000000000601000 A _end
                 U _start
Подробности:
Bash
1
readelf -a a.out
Кликните здесь для просмотра всего текста

Заголовок ELF:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Класс: ELF64
Данные: дополнение до 2, little endian
Версия: 1 (current)
OS/ABI: UNIX - System V
Версия ABI: 0
Тип: EXEC (Исполняемый файл)
Машина: Advanced Micro Devices X86-64
Версия: 0x1
Адрес точки входа: 0x400040
Начало заголовков программы: 0 (байт в файле)
Начало заголовков программы: 240 (байт в файле)
Флаги: 0x0
Размер этого заголовка: 64 (байт)
Размер заголовков программы: 0 (байт)
Число заголовков программы: 0
Размер заголовков раздела: 64 (байт)
Число заголовков раздела: 4
Индекс табл. строк загол. раздела: 1

Заголовки разделов:
[Нм] Имя Тип Адрес Смещение
Размер Разм.Ent Флаги Ссылк Инфо Выравн
[ 0] NULL 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[ 1] .shstrtab STRTAB 0000000000000000 000000d1
000000000000001b 0000000000000000 0 0 1
[ 2] .symtab SYMTAB 0000000000000000 00000040
0000000000000078 0000000000000018 3 1 8
[ 3] .strtab STRTAB 0000000000000000 000000b8
0000000000000019 0000000000000000 0 0 1
Обозначения флагов:
W (запись), A (назнач), X (исполняемый), M (слияние), S (строки), l (большой)
I (инфо), L (порядок ссылок), G (группа), T (TLS), E (исключён), x (неизв.)
O (треб. доп. обработка ОС) o (специфич. для ОС), p (специф. для процессора)

В этом файле нет групп разделов.

В этом файле нет заголовков программы.

В этом файле нет перемещений.

The decoding of unwind sections for machine type Advanced Micro Devices X86-64 is not currently supported.

Таблица символов «.symtab» содержит 5 элементов:
Чис: Знач Разм Тип Связ Vis Индекс имени
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000000000 0 NOTYPE GLOBAL DEFAULT UND _start
2: 0000000000601000 0 NOTYPE GLOBAL DEFAULT ABS __bss_start
3: 0000000000601000 0 NOTYPE GLOBAL DEFAULT ABS _edata
4: 0000000000601000 0 NOTYPE GLOBAL DEFAULT ABS _end

В этом файле не найдена информация о версии.
3
pcmax
330 / 38 / 5
Регистрация: 29.01.2018
Сообщений: 797
27.10.2019, 10:13  [ТС] 18
в моем примере опечатка: там регистр r0 вместо r9.

напишите пожалуйста как бы Вы вызвали функцию на Gas написанную в отдельном файле из основного кода на Gas в другом файле?
0
politoto
2230 / 278 / 34
Регистрация: 23.07.2018
Сообщений: 724
Записей в блоге: 1
27.10.2019, 10:20 19
Assembler
1
call external_function
2
pcmax
330 / 38 / 5
Регистрация: 29.01.2018
Сообщений: 797
27.10.2019, 10:25  [ТС] 20
Цитата Сообщение от politoto Посмотреть сообщение
call external_function

пожалуйста не поленитесь набросать вес код и функции и основной. это всего несколько строк.
0
27.10.2019, 10:25
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2019, 10:25

Шаблоны и раздельная компиляция
Здравствуйте! Если просто я пишу класс, например: class Test { private: int *pm; ...

Раздельная компиляция и шаблоны
Есть 3 файла с кодом: 1) foo.hpp template<typename T> class foo { public: T bar; foo();...

Раздельная компиляция и шаблоны
привет. возьму вот такой выдуманный пример #ifndef CCLASS_H #define CCLASS_H #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.