Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/27: Рейтинг темы: голосов - 27, средняя оценка - 4.93
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
GAS/AT&T

Объявить глобальные переменные

16.10.2019, 14:05. Показов 5906. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
привет. помогите пожалуйста разобраться с глобальными переменными в Gas Assembler. хотел было поместить в созданную глобальную переменную значение и после прочитать его из программы на C++ , но не получилось.

глобальную переменную объявлял в Gas таким вот образом.

Assembler
1
2
3
4
5
6
7
8
9
10
.section .bss
.global var:
.space 2
 
.section .text
.global _start
_start:
 
mov $4, %rcx
mov %rcx, (var)
что неправильно?

Добавлено через 3 часа 3 минуты
что глобальные переменные у Вас тоже слабое место? рады бы, да не можете объяснить?
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.10.2019, 14:05
Ответы с готовыми решениями:

Глобальные переменные из Си в ассемблер
Как передать переменную, заданную глобально, из си в ассемблерную функцию?

Глобальные и локальные переменные с одинаковыми именами
Добрый день. Как в ассемблере создать две переменные с одинаковыми именами? Одна будет глобальная, а другая локальная. Да и можно ли так...

Как объявить глобальные переменные
Здравствуйте, снова нужна Ваша помощь! Создан проект в Visual Studio 2013, в нем есть несколько форм с кнопками и несколькими (тремя)...

12
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
17.10.2019, 10:11
Лучший ответ Сообщение было отмечено pcmax как решение

Решение

Попробуйте определить символ var по аналогии со _start.
Разница только в секции, где они размещаются.

Скопируйте две строчки, где опредеяется _start в секцию .bss и замените в них _start на var.

Когда получите объектный модуль, командой
Bash
1
nm mymod.o
можете проверить, какие символы в нём определены, и какие есть внешние ссылки на символы, определённые где-то ещё
2
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
17.10.2019, 17:26  [ТС]
напишите пожалуйста все что вы сказали выше , в коде Gas
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
17.10.2019, 17:35
pcmax, Вы пользуетесь текстовыми редакторами? Умеете копировать, вставлять и заменять строчки?
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
17.10.2019, 19:16  [ТС]
да это не работает. уже третья тема и нет рельного ответа. как только я пытаюсь прописать _start в файл f.s то после комантовки линковщик ругается. если можете подсказать конкретно что делать,то пожалуйста подскажите. ну если не можете,, то толку от от подсказок вокруг да около к сожалению не будет.
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
17.10.2019, 21:34
Лучший ответ Сообщение было отмечено pcmax как решение

Решение

С тем кодом, который Вы привели в вопросе, у меня не дошло до компоновки.
Заругался ассемблер и объектный файл не создался:

f.s: Assembler messages:
f.s:2: Error: junk at end of line, first unrecognized character is `:'
Я предложил следуюищие изменения в Вашем коде:
Bash
1
diff t.s f.s
Code
1
2
3
4
5
2c2,3
< .global var:
---
> .global var
> var:
после этих изменений файл ассемблировался успешно
Bash
1
2
as f.s 
nm a.out
Code
1
2
0000000000000000 T _start
0000000000000000 B var
и в объектном файле теперь определены 2 символа.

Когда же Вы скрываете Ваш код и текст сообщений об ошибках компоновки, то тогда,
к сожалению, помочь Вам бывает трудно.
2
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
17.10.2019, 21:57  [ТС]
я сделал так

C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
extern int а;
 
int main(){
 
 
std::cout << a;
 
}
 
этот файл есть с.cpp

gcc c.cpp -S

я получил c.s


открыл его и посмотрел.

добавил в него global _start

после сделал
gcc -c c.s
получил c.o
cделал g++ c.cpp -c -o f.o
получил f.o
дальше делаю
g++ f.o c.o -o st
получаю ошибку. ругается на метку start.


а она мне нужна. ведь я хотел схитрить и в c.s файле написать программу на GAS и после поместить результат в "a" и вывести его на экран в main();

не получилось
1
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
17.10.2019, 22:29
Лучший ответ Сообщение было отмечено pcmax как решение

Решение

Остроумно!
А кто бы тогда вызывал main() и инициализировал стандартную библиотеку с++ ?

Добавлено через 10 минут
Я бы Ваш план реализовал примерно так:

asm.c++
C++
1
2
3
4
5
6
int a;
int asm_function()
{
    a = 777;
    return 888;
}
Получаем ассемблерный текст и пишем свой код внутри функции asm_function().

А её уже вызываем из main()
c.c++
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
extern int a, asm_function(); // определены в "асмовском" коде
 
int main(){
 
   asm_function();
 
   std::cout << a;
 
}
2
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
18.10.2019, 11:06  [ТС]
ну значит у Вас не зря репутация около 1600! это работает!


а почему не работал мой вариант? можете дать полный ответ?
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
18.10.2019, 11:53
Полный не могу. Я же не знаю в точности, что у Вас получилось, и какие претензии были у g++ к метке start.
0
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
18.10.2019, 11:54  [ТС]
поспешил.

вылетает вот эта ошибка , если пытаюсь что-то добавить в код Gas

Bash
1
2
3
4
5
6
/usr/bin/ld: s.o:(.bss+0x0): multiple definition of `a'; asm.o:(.bss+0x0): first defined here
/usr/bin/ld: s.o: in function `asm_function()':
asm.cpp:(.text+0x0): multiple definition of `asm_function()'; asm.o:asm.cpp:(.text+0x0): first defined here
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/Scrt1.o: in function `_start':
(.text+0x20): undefined reference to `main'
collect2: error: ld returned 1 exit status
0
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
18.10.2019, 12:25
(.text+0x20): undefined reference to `main'
Забыли прилинковать модуль, где определена main()

/usr/bin/ld: s.o.bss+0x0): multiple definition of `a'; asm.o.bss+0x0): first defined here
a определён в двух модулях: s и asm

Добавлено через 21 минуту
Какую командную строку использовали для сборки?
Bash
1
nm s.o asm.o
покажет какие символы в каких модулях определены. Поделитесь результатом?

Цитата Сообщение от pcmax Посмотреть сообщение
если пытаюсь что-то добавить в код Gas
что именно добавить и в какое место?

Добавлено через 2 минуты
Какой код получился после добавления?
1
 Аватар для pcmax
443 / 74 / 7
Регистрация: 29.01.2018
Сообщений: 1,274
18.10.2019, 12:40  [ТС]
все))))))))))) я нашел что делал неправильно))))) спасибо
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.10.2019, 12:40
Помогаю со студенческими работами здесь

Как в хедере объявить глобальные переменные?
как в хедере объявить int Result_Time = 0;

Где объявить глобальные переменные и массив? И как это сделать?
Работаю с формами, очень нужны глобальные переменные, но я кажется тупая, и тулю их не туда или не так, в общем выбивает ошибку. ...

Глобальные и статические глобальные переменные
Скажите, чем отличаются глобальные переменные от статических глобальных переменных?

Глобальные переменные
Как можно описать пункты меню (массив), чтобы потом его можно было подгружать из разных файлов???

Глобальные переменные в С#
Здравствуйте! Есть проект с БД MySql. Необходимо в одном классе создать переменную(например подключение к БД), а затем через формы уже...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru