Форум программистов, компьютерный форум, киберфорум Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/55: Рейтинг темы: голосов - 55, средняя оценка - 4.84
0 / 0 / 1
Регистрация: 24.03.2018
Сообщений: 41

Ввод/вывод массива с использованием scanf, printf в ассемблерной вставке (C++)

02.10.2019, 21:08. Показов 11005. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как ввести/вывести массив с помощью асемблерной вставки в c++
используя call scanf,printf
очень плохо знаю ассемблер,подскажите как правильно написать
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
#include <iostream>
using namespace std;
int main()
{
    char s[] = "%d";
    int mas[10];
    [ASM]
        _asm {
        finit //инициализация сопроцессора
        //=====Ввод=====
        mov ecx, 10
        lea eax, mas
        xor ax,ax 
        //поместить адрес переменной x в eax
        push eax
        lea eax, s
        push eax
        b:
             call scanf
             add eax,4
             add esp, 4
        loop b
    }
        [/ASM]
    for (int i = 0; i < 10; i++)
    {
        cout << mas[i]<<endl ;
    }
    system("pause");
    return 0;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
02.10.2019, 21:08
Ответы с готовыми решениями:

Вывод массива в ассемблерной вставке
Добрый вечер. Каким образом можно массив из 10 чисел с которыми я поработал в ассемблере передать обратно в С++. Как передать одну...

ASM + C++: получить значения элементов массива в ассемблерной вставке
Здравствуйте. Сразу к делу. Есть шортовый массив и его заполнение: short mas; for (int k = 0; k &lt; NMAX; k++) {

Прерывания в ассемблерной вставке
Здравствуйте. В программу, написанную на С++, нужно добавить ассемблерную вставку, поддерживающую прерывания (int 21h например). Каким...

5
 Аватар для Kukuxumushu
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
02.10.2019, 22:52
Naglse, ошибки проанализируйте самостоятельно. Обратите внимание, что scanf портит регистры, поэтому их надо сохранять/восстанавливать.
Assembler Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
mov ecx,10   // Счётчик итераций
lea ebx,mas  // Указатель на начало массива
M:push ebx   // Цикл ввода, сохранение состояния
  push ecx
  push ebx   // Адрес ячейки для записи
  lea eax,s  // Указатель на форматную строку
  push eax
  call scanf // Вызов scanf
  add esp,8  // Очистка стека
  pop ecx    // Восстановление состояния
  pop ebx
  add ebx,4  // Переход к следующей ячейке
  loop M
3
0 / 0 / 1
Регистрация: 24.03.2018
Сообщений: 41
03.10.2019, 11:04  [ТС]
Спасибо,
написал по примеру вывод,выводит правильно,но вызывается исключение:
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
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
#include <iostream>
using namespace std;
int main() {
    int mas[10];
    char str1[] = "%d";
    __asm {
        lea esi, mas;
        mov ecx, 10;
    l2: push esi;
        push ecx;
        push esi;
        lea eax,str1
        push eax;
        call scanf;
        add esp, 8;
        pop ecx;
        pop esi
        add esi, 4;
        loop l2;
        sub esi,40;
        mov ecx, 10;
        xor eax,eax
    l3: push [esi];
        push ecx;
        push [esi];
        lea eax,str1
        push eax;
        call printf;
        add esp, 8;
        pop ecx;
        add esi, 4;
        loop l3;
    }
    return 0;
    system("pause");
}
0
 Аватар для Kukuxumushu
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
03.10.2019, 11:48
Naglse, в printf у вас стек не выровнен - 4 пуша и только 1 поп+8 байт. К тому же вы зачем-то сохраняете [ecx] вместо самого регистра, а потом не восстанавливаете.
Assembler Скопировано
1
2
3
4
5
6
7
8
9
10
11
12
13
lea esi,mas
mov ecx,10
l3:push esi
   push ecx
   push [esi]
   lea eax,str1
   push eax
   call printf
   add esp,8
   pop ecx
   pop esi
   add esi,4
   loop l3
3
0 / 0 / 1
Регистрация: 24.03.2018
Сообщений: 41
03.10.2019, 15:29  [ТС]
Понял,спасибо большое

Добавлено через 3 часа 33 минуты
вроде работает,но я не понял,почему push esi два раза и зачем пушить ecx?
0
 Аватар для Kukuxumushu
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
03.10.2019, 15:41
Лучший ответ Сообщение было отмечено Naglse как решение

Решение

Цитата Сообщение от Naglse Посмотреть сообщение
почему push esi два раза
Не два. Первый раз - действительно пушим сам ESI в рамках процедуры сохранения восстановления контекста. Второй - пушим переменную в качестве параметра printf, которая находится по адресу, лежащим в ESI.
Цитата Сообщение от Naglse Посмотреть сообщение
зачем пушить ecx
Это называется "сохранение контекста", перед call printf пушится всё, что используется в процедуре, а после вызова - восстанавливается обратно, т.к. внутри printf регистры безвозвратно трутся.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.10.2019, 15:41
Помогаю со студенческими работами здесь

Вычислить значение выражения в ассемблерной вставке в C++
посчитать a*b/c ассемблерная вставка к с++ на VS 2013. Переменные типа unsigned short, действия, как я понимаю с регистрами AX,BX... но...

В ассемблерной вставке занести слово в регистр esi
Подскажите, пожалуйста, как правильно в ассемблерной вставке занести слово в регистр esi? Задача:в слове из 8 символов найти разность...

Как обращаться к членам структуры в ассемблерной вставке на си?
функция делает распаковку битовых групп. По заданию поля битовой группы передаются в структуре. Как к ним можно обращаться в ассемблерной...

Как использовать условные операторы в ассемблерной вставке
Вообщем суть в том,чтобы переписать программу,ранее написанную на паскале,в код asm Asm используется,встроенный в Turbo Pascal....

Ошибка в ассемблерной вставке (сортировка методом пузырька, Паскаль)
Доброго времени суток, помогите пожалуйста отловить ошибку. Программа для сортировки методом пузырька на паскале program aaaaaaa; ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Компиляция C++ с Clang API
NullReferenced 24.03.2025
Компиляторы обычно воспринимаются как черные ящики, которые превращают исходный код в исполняемые файлы. Мы запускаем компилятор командой в терминале, и вуаля — получаем бинарник. Но что если нужно. . .
Многопоточное программировани­е в C#: Класс Thread
UnmanagedCoder 24.03.2025
Когда запускается приложение на компьютере, операционная система создаёт для него процесс - виртуальное адресное пространство. В C# этот процесс изначально получает один поток выполнения — главный. . .
SwiftUI Data Flow: Передача данных между представлениями
mobDevWorks 23.03.2025
При первом знакомстве со SwiftUI кажется, что фреймворк предлагает избыточное количество механизмов для передачи данных: @State, @Binding, @StateObject, @ObservedObject, @EnvironmentObject и другие. . . .
Моки в Java: Сравниваем Mockito, EasyMock, JMockit
Javaican 23.03.2025
Как протестировать класс, который зависит от других сложных компонентов, таких как базы данных, веб-сервисы или другие классы, с которыми и так непросто работать в тестовом окружении? Для этого и. . .
Архитектурные паттерны микросервисов: ТОП-10 шаблонов
ArchitectMsa 22.03.2025
Популярность микросервисной архитектуры объясняется множеством важных преимуществ. К примеру, она позволяет командам разработчиков работать независимо друг от друга, используя различные технологии и. . .
Оптимизация рендеринга в Unity: Сортировка миллиона спрайтов
GameUnited 22.03.2025
Помните, когда наличие сотни спрайтов в игре приводило к существенному падению производительности? Время таких ограничений уходит в прошлое. Сегодня геймдев сталкивается с задачами совершенно иного. . .
Образование и практика
Igor3D 21.03.2025
Добрый день А вот каково качество/ эффективность ВУЗовского образования? Аналитическая геометрия изучается в первом семестре и считается довольно легким курсом, что вполне справедливо. Ну хорошо,. . .
Lazarus. Таблица с объединением ячеек.
Massaraksh7 21.03.2025
Понадобилась представление на экране таблицы с объединёнными ячейками. И не одной, а штук триста, и все разные. На Delphi я использовал для этих целей TStringGrid, и то, кривовато получалось. А в. . .
Async/await в Swift: Асинхронное программировани­е в iOS
mobDevWorks 20.03.2025
Асинхронное программирование долго было одной из самых сложных задач для разработчиков iOS. В течение многих лет мы сражались с замыканиями, диспетчеризацией очередей и обратными вызовами, чтобы. . .
Колмогоровская сложность: Приёмы упрощения кода
ArchitectMsa 20.03.2025
Наверное, каждый программист хотя бы раз сталкивался с кодом, который напоминает запутанный лабиринт — чем дальше в него погружаешься, тем сложнее найти выход. И когда мы говорим о сложности кода, мы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер