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

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

12.11.2019, 21:51. Показов 1310. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru