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

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

02.10.2019, 21:08. Показов 10745. Ответов 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)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.10.2019, 21:08
Ответы с готовыми решениями:

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

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

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

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

5
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
02.10.2019, 22:52 2
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  [ТС] 3
Спасибо,
написал по примеру вывод,выводит правильно,но вызывается исключение:
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
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
03.10.2019, 11:48 4
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  [ТС] 5
Понял,спасибо большое

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

Решение

Цитата Сообщение от Naglse Посмотреть сообщение
почему push esi два раза
Не два. Первый раз - действительно пушим сам ESI в рамках процедуры сохранения восстановления контекста. Второй - пушим переменную в качестве параметра printf, которая находится по адресу, лежащим в ESI.
Цитата Сообщение от Naglse Посмотреть сообщение
зачем пушить ecx
Это называется "сохранение контекста", перед call printf пушится всё, что используется в процедуре, а после вызова - восстанавливается обратно, т.к. внутри printf регистры безвозвратно трутся.
1
03.10.2019, 15:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.10.2019, 15:41
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru