Написал простую программу с ассемблерной вставкой, использующую циклическую конструкцию:
// laba4.cpp: определяет точку входа для консольного приложения.
//
#include "stdafx.h"
int main()
{
int a, b, n;
cin >> n;
_asm {
mov ebx, 1;
mov ecx, n;
dec ecx;
mov ebp, 1;
mov esi, 1;
mov edi, -1;
loop_1:
mov eax, edi;
imul ebp;
mov esp, eax;
inc esi;
mov eax, ebx;
mul esi;
mov ebx, eax;
mov eax, ebp;
mul esi;
mov ebp, eax;
add ebx, esp;
neg edi;
loop loop_1;
mov a, ebx;
mov b, ebp;
}
cout << a << "/" << b;
return 0;
}
Так вот, при выполнении записи значений переменных из регистров (mov a, ...; mov b, ...
возникает ошибка "Нарушение доступа для записи". Что здесь не так?
Как минимум, не трогайте регистры ebp
и esp
- вы портите стековые указатели. Поскольку запись в переменные идет с использованием значения (безнадежно вами запорченного) регистра ebp
- что-то типа
mov DWORD PTR _a$[ebp], ebx
mov DWORD PTR _b$[ebp], ebp
то вы и получаете ерунду.
Насколько верно то, что вы считаете - не знаю, но и тут у меня большие сомнения. Но это уже вопрос другой...
Виртуальный выделенный сервер (VDS) становится отличным выбором
Имеется клиент-сервер проект, содержание cmakelist следующее:
Хочу получить доступ к переменной appКак это сделать?