“Ошибка доступа для записи”. В чём проблема?

186
25 апреля 2017, 08:34

Написал простую программу с ассемблерной вставкой, использующую циклическую конструкцию:

// 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, ... возникает ошибка "Нарушение доступа для записи". Что здесь не так?

Answer 1

Как минимум, не трогайте регистры ebp и esp - вы портите стековые указатели. Поскольку запись в переменные идет с использованием значения (безнадежно вами запорченного) регистра ebp - что-то типа

mov DWORD PTR _a$[ebp], ebx
mov DWORD PTR _b$[ebp], ebp

то вы и получаете ерунду.

Насколько верно то, что вы считаете - не знаю, но и тут у меня большие сомнения. Но это уже вопрос другой...

READ ALSO
Собрать несколько бинарников cmake

Собрать несколько бинарников cmake

Имеется клиент-сервер проект, содержание cmakelist следующее:

246
Получить глобальную переменную App. Webpack 2 - Marionette

Получить глобальную переменную App. Webpack 2 - Marionette

Хочу получить доступ к переменной appКак это сделать?

270
Обновление переменной во view

Обновление переменной во view

Господа, доброго времениНачал делать приложение на asp

208
&ldquo;Парсинг&rdquo; блока с поддомена

“Парсинг” блока с поддомена

ЗдравствуйтеЕсть два сайта: на основном домене и на поддомене

244