0 / 0 / 1
Регистрация: 24.03.2018
Сообщений: 41
|
||||||
1 | ||||||
Ввод/вывод массива с использованием scanf, printf в ассемблерной вставке (C++)02.10.2019, 21:08. Показов 10745. Ответов 5
Метки нет (Все метки)
Как ввести/вывести массив с помощью асемблерной вставки в c++
используя call scanf,printf очень плохо знаю ассемблер,подскажите как правильно написать
0
|
02.10.2019, 21:08 | |
Ответы с готовыми решениями:
5
Вывод массива в ассемблерной вставке ASM + C++: получить значения элементов массива в ассемблерной вставке Прерывания в ассемблерной вставке Вычислить значение выражения в ассемблерной вставке в C++ |
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
|
||||||
02.10.2019, 22:52 | 2 | |||||
Naglse, ошибки проанализируйте самостоятельно. Обратите внимание, что
scanf портит регистры, поэтому их надо сохранять/восстанавливать.
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.
0
|
1624 / 806 / 146
Регистрация: 13.06.2015
Сообщений: 3,266
|
||||||
03.10.2019, 11:48 | 4 | |||||
Naglse, в printf у вас стек не выровнен - 4 пуша и только 1 поп+8 байт. К тому же вы зачем-то сохраняете [ecx] вместо самого регистра, а потом не восстанавливаете.
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 как решение
Решение
Не два. Первый раз - действительно пушим сам ESI в рамках процедуры сохранения восстановления контекста. Второй - пушим переменную в качестве параметра printf, которая находится по адресу, лежащим в ESI.
Это называется "сохранение контекста", перед call printf пушится всё, что используется в процедуре, а после вызова - восстанавливается обратно, т.к. внутри printf регистры безвозвратно трутся.
1
|
03.10.2019, 15:41 | |
03.10.2019, 15:41 | |
Помогаю со студенческими работами здесь
6
В ассемблерной вставке занести слово в регистр esi Как обращаться к членам структуры в ассемблерной вставке на си? Как использовать условные операторы в ассемблерной вставке Ошибка в ассемблерной вставке (сортировка методом пузырька, Паскаль) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |