Audes
@Audes

Ошибка внутри ассемблерной вставки?

Экспериментирую с ассмеблерными вставками (пока не нашел хороших статей). К ошибке в коде приводят последние строки, которые заменяю "return 0". Вот только в прошлый раз этот отрывок был рабочим.
#include <iostream>
using namespace std;

int main() {
	volatile long i = 1024;
	volatile int j = 256;
	_asm {
		add i, eax;
		xor eax, eax;
		add eax, j;
		xor j, eax;
	}
	cout << "eax value: " << i - 1024 << endl << "j xor j: " << j;
	cin.get();
	_asm { 
		xor eax, eax; //Вот тут
		retn;
	}
}

e6df0a0819124d988abc1e99da28d5e7.JPG408427f187d348329b8a1cd3ed756882.JPG
  • Вопрос задан
  • 389 просмотров
Решения вопроса 1
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
1. По стандарту C++, всякая функция, которая что-то возвращает, должна содержать return. Иначе - неопределенное поведение, так как компилятор не сможет сгенерировать правильный эпилог.
2. Пролог и эпилог должен генерировать кто-то один.
3. Некоторые особо дурные компиляторы умеют отключать генерирование пролога и эпилога. Напимер, VC++ это делает при помощи __declspec(naked).

Вывод:
Либо вы выключаете пролог/эпилог и пишите на ассемблере всю функцию, включая пролог и эпилог.
Либо вы пишите только ВСТАВКИ, и не выносите мозг компилятору, перекашивая ему стек. (В начале и в конце вставки стек должен быть прежним).
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@vilgeforce
Раздолбай и программист
Полный текст ошибки угадывать предлагаете?
Ответ написан
@sitev_ru
sitev.ru - мой блог ...
Ошибка в retn. Поставь в конце main сишный оператор return; и дизассемблируй - и скинь сюда... Там и будет ответ...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы