Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
 Аватар для Agnarrock
0 / 0 / 0
Регистрация: 16.04.2017
Сообщений: 16

Использование внешних переменных в asm вставке и компиляцией gcc

12.11.2019, 21:51. Показов 1272. Ответов 1

Студворк — интернет-сервис помощи студентам
Есть такой код для выполнения операций со входной строкой (функциональная часть сейчас неважна):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include <iostream>
#include <fstream>
#include <clocale>
 
#define MAX_LENGTH 80
 
using namespace std;
 
int main()
{
    char input_string[MAX_LENGTH];
    char output_string[MAX_LENGTH];
    cin.getline(input_string, MAX_LENGTH, '\n');
    asm
    (R"(
        # загружаем в eax адрес значения по адресу входной строки
        lea input_string, %eax
        # esi - индекс источника
        mov %eax, %esi
 
        # lea output_string, %eax
        # edi - идекс приёмника
        # mov %eax, %edi
 
        BEGINCYCLE:
        # копирует один байт из памяти по адресу DS:SI в регистр AL. 
        # После выполнения команды, регистр SI увеличивается на 1, 
        # если флаг DF = 0, или уменьшается на 1, если DF = 1.
        lodsb
            # логическое И для проверки регистра на пустоту
            # команда влияет только на флаги
            test %al, %al
            # переход, если ZF (флаг "нуля") == 1
            je EXIT
 
            cmp $0x41, %al # >= 'A'
            # усл-ие перехода CF=1,
            # перейти, если не меньше или равно
            jnbe LatinLetterGeneral
 
            jmp NEXT
 
            LatinLetterGeneral:
                cmp $0x5A, %al # <= 'Z'
                jnae LatinLetterFinal
                cmp $0x61, %al # >= 'a'
                jnbe LatinLetterFinal
                jmp NEXT
 
            LatinLetterFinal:
                cmp $0x7A, %al # > 'z'
                ja NEXT
 
                # FIXME: нельзя так сравнивать
                # cmp %al, %ax
                sub $0x30, %ax # привели к числу
                push %cx
                mov $2, %cx
                rol $4, %dl
                mov $0x300f, %ax
                and %dl, %al
                aaa
                aad $0x11
                pop %cx
                # FIXME: так тоже нельзя!
                # mov %di, %al
 
                jmp NEXT
 
            NEXT:
                # сохраняет регистр AL в ячейке памяти по адресу ES:DI. 
                # После выполнения команды, регистр DI увеличивается на 1, 
                # если флаг DF = 0, или уменьшается на 1, если DF = 1.
                stosb
                jmp BEGINCYCLE
 
            EXIT:
                stosb
    )");
 
    cout << "\n\nРезультат:" << endl;
    ofstream file_output("output.txt");
    int i = 0;
    while (output_string[i] != '\0')
    {
        cout << output_string[i];
        file_output << output_string[i];
        i++;
    }
    cout << endl;
    file_output << endl;
    file_output.close();
 
    getchar();
 
    system("pause");
 
    return 0;
}
Проблема состоит в том, что при компиляции данной командой:
Bash
1
g++ -m32 -o main lr4_comments.cpp
выпадают ошибки:

Bash
1
2
3
/usr/bin/ld: /tmp/ccG1KmeQ.o: in function `main':
lr4_comments.cpp:(.text+0x110): undefined reference to `input_string'
collect2: error: ld returned 1 exit status
Как возможно решить данную проблему обращения ко внешним переменным?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.11.2019, 21:51
Ответы с готовыми решениями:

Использование всех внешних переменных в динамической функции
Здравствуйте! Допустим, меня есть определенный класс, в котором есть определенный метод: class testclass { public function...

Проблемы с компиляцией gcc
Здравствуйте, у меня такая проблема: Когда я компилирую, у меня затирается .срр файл.... Может кто сталкивался с таким... пропал такой...

Программа в asm вставке C++
Запнулся на этой задаче: В памяти задан массив из 10-ти элементов. Заменить эти числа произведением их старшего и младшего слова. ...

1
Модератор
2131 / 1000 / 170
Регистрация: 23.07.2018
Сообщений: 3,349
Записей в блоге: 3
13.11.2019, 04:38
Разные варианты возможны.
Если нужно только получить исполняемый файл, то проще всего перенести определение
C++
1
char input_string[MAX_LENGTH];
перед
main()
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
13.11.2019, 04:38
Помогаю со студенческими работами здесь

Вызов функции в asm-вставке
Здраствуйте, уже 3 час бьюсь что бы вызвать функцию в asm вставке, но никак не удаётся Этот код выполняется в обычном цикле, где i...

Работой с массивом в asm вставке C++
Доброго времени суток. В университете дали задание: на C++ задать массив, инициализировать его. После этого в ассемблерной вставке...

AVRstudio 4 + GCC + ASM
Доброго времени суток! У меня назрел вопрос - можно ли использовать при написании использовать самописные функции на ассемблере? Если...

Не получается передать адрес строки в asm вставке
Доброе время суток. При выполнении данного кода возникает две ошибки: 1 не получается передать адрес строки в регистр dx 2 компилятор...

Asm вставки в AVR GCC
Есть у кого-то описание как писать эти _страшные_ вещи? Конструкция подразумевающая всего лишь swap регистра, превращается в: #define ...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru