Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.70
pepepe
0 / 0 / 0
Регистрация: 08.01.2013
Сообщений: 3
#1

__asm ошибка Access violation writing location - C++

08.01.2013, 21:52. Просмотров 3203. Ответов 8
Метки нет (Все метки)

Код ниже выводит следующую ошибку
"Unhandled exception at 0x004116a7 in cousach.exe: 0xC0000005: Access violation reading location 0x00000003"

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
int counter(int num, int power );
 
int _tmain(int argc, _TCHAR* argv[])
{
    printf_s( "power %d\n", counter( 3, 5) );
    getch();
    return 0;
}
 
int counter(int num, int power )
{
    __asm
    {
        mov eax, num ; num
            mov ecx, power ; power -1
            mov esi, 0
            mov ebp, num
power_f:
 
        imul ebp ; 8 * 8 
            mov eax, eax ; ebp = 64
 
            inc esi
 
            cmp esi, ecx
            jl power_f 
;        нужно вывести eax
 
    }
}
делаю по примеру ниже, который работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
 
int power2( int num, int power );
 
int main( void )
{
    printf_s( "3 times 2 to the power of 5 is %d\n", \
              power2( 3, 5) );
}
int power2( int num, int power )
{
   __asm
   {
      mov eax, num    ; Get first argument
      mov ecx, power  ; Get second argument
      shl eax, cl     ; EAX = EAX * ( 2 to the power of CL )
   }
   // Return with result in EAX
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2013, 21:52
Здравствуйте! Я подобрал для вас темы с ответами на вопрос __asm ошибка Access violation writing location (C++):

Ошибка Access violation writing location - C++
Структура и объявление массива: struct Particle { float X; float Y; float Dx; float Dy; float R; int SegCount; ...

Access violation writing location - C++
#include &lt;iostream&gt; using namespace std; template &lt; typename t &gt; void QuickSort( t array, int left,int right) { int i = left; ...

Access violation writing location - C++
Вылетает эта ошибка. В чём может быть проблема? Программа выполняется выводит результат, а после вылетает исключение. #include...

Access violation writing location - C++
Добрый день! на строке ptr = ptr; бросает unhandeled exeption: Access violation writing location, не пойму почему, может уже туплю....

Непонятная ошибка "Access violation writing location 0xcdcdcdd5" - C++
#include &lt;iostream&gt; #include &lt;cstdlib&gt; struct Node{ int data; Node *next, *prev; }; typedef Node...

Ошибка "Unhandled exception, Access violation writing location" - C++
Пишу вот так: root-&gt;child1-&gt;parent=root; root-&gt;child2-&gt;parent=root;выходит ошибка Unhandled exception at 0x00073dec in Regul.exe:...

8
Kastaneda
Нарушитель
Эксперт С++
4669 / 2873 / 232
Регистрация: 12.12.2009
Сообщений: 7,307
Записей в блоге: 2
Завершенные тесты: 1
08.01.2013, 22:13 #2
Советую перед началом выполнения ассемблерной вставки сохранять все используемые регистры и восстанавливать их после выполнения нужного кода, это во первых. А во вторых регистр ebp используется для организации стек фрейма, поэтому его вообще менять нельзя. Думаю проблема как раз в этом.

Добавлено через 1 минуту
Цитата Сообщение от pepepe Посмотреть сообщение
"Access violation reading location 0x00000003"
Ошибка говорит о том, что невозможно прочитать память по адресу 3, а ты в ebp как раз кладешь 3.

Добавлено через 9 минут
Вот нашел хорошую статью на эту тему.
0
Psilon
Master of Orion
Эксперт .NET
5902 / 4799 / 634
Регистрация: 10.07.2011
Сообщений: 14,407
Записей в блоге: 5
Завершенные тесты: 4
08.01.2013, 22:19 #3
по-моему там AT&T синтаксис, так что не стоит вчитываться в асмовский код, если у вас был только x86
0
Kastaneda
08.01.2013, 22:21
  #4

Не по теме:

Цитата Сообщение от Psilon Посмотреть сообщение
там AT&T синтаксис
Цитата Сообщение от Psilon Посмотреть сообщение
если у вас был только x86
Ты понял, что написал?

0
ValeryS
Модератор
6675 / 5084 / 475
Регистрация: 14.02.2011
Сообщений: 17,056
08.01.2013, 22:31 #5
Цитата Сообщение от pepepe Посмотреть сообщение
imul ebp ; 8 * 8
здесь ты умножаешь значение в eax на значение ebp результат в eax и edx
Цитата Сообщение от pepepe Посмотреть сообщение
mov eax, eax ; ebp = 64
пересылаешь из eax в eax зачем? пустая операция да и в ebp осталось 8

Добавлено через 2 минуты
Цитата Сообщение от pepepe Посмотреть сообщение
int counter(
в конце return то добавь
0
Psilon
08.01.2013, 22:31
  #6

Не по теме:

Kastaneda, ну я имел ввиду Intel, они у меня с x86 ассоциируются, вот и глюканул мозг

0
ValeryS
Модератор
6675 / 5084 / 475
Регистрация: 14.02.2011
Сообщений: 17,056
08.01.2013, 22:34 #7
Цитата Сообщение от pepepe Посмотреть сообщение
mov ebp, num
используй ebx как правильно заметили ebp часто работает со стеком в результате при выходе может улететь в космос
1
pepepe
0 / 0 / 0
Регистрация: 08.01.2013
Сообщений: 3
08.01.2013, 22:44  [ТС] #8
Цитата Сообщение от Kastaneda Посмотреть сообщение
Советую перед началом выполнения ассемблерной вставки сохранять все используемые регистры и восстанавливать их после выполнения нужного кода, это во первых. А во вторых регистр ebp используется для организации стек фрейма, поэтому его вообще менять нельзя. Думаю проблема как раз в этом.

Добавлено через 1 минуту

Ошибка говорит о том, что невозможно прочитать память по адресу 3, а ты в ebp как раз кладешь 3.

Добавлено через 9 минут
Вот нашел хорошую статью на эту тему.
Гениально!!! реально дело в неправильном использовании регистра ebp. его я заменил на ebx и заработало.
Я сейчас делаю курсач, возможно будут ещё вопросы, то мне лучше писать в этой теме или создать другую?

Добавлено через 44 секунды
Цитата Сообщение от ValeryS Посмотреть сообщение
используй ebx как правильно заметили ebp часто работает со стеком в результате при выходе может улететь в космос
да, так и сделал только что.
0
Kastaneda
08.01.2013, 22:47     __asm ошибка Access violation writing location
  #9

Не по теме:

Цитата Сообщение от pepepe Посмотреть сообщение
то мне лучше писать в этой теме или создать другую?
По правилам форума одна тема - один вопрос. Так что лучше новую тему создать, т.к. модераторы все равно это сделают, если здесь напишешь.

1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2013, 22:47
Привет! Вот еще темы с ответами:

Ошибка исполнения "Access violation writing location 0x.........." - C++
Здравствуйте! Написал код в MS Visual Studio 2012 64-битной такой код: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

Ошибка компилятора: "Access violation writing location" - C++
Здравствуйте! Проблема в том что я пишу простой скрипт и у меня всегда вылезает окошко с надписью : Unhandled exception at 0X002611F1 in...

Ошибка "Access violation writing location" при работе с массивом. - C++
Задание номер 2 #include &lt;stdio.h&gt; #include &lt;cstdlib&gt; #include &lt;math.h&gt; #include &lt;cmath&gt; #include &lt;iostream&gt; #include...

0xC0000005: Access violation writing location 0xFDFDFE11 - C++
ошибка, вылетает после запуска программы. Exception thrown at 0x013E1C0A in массивы.exe: 0xC0000005: Access violation writing location...


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

Или воспользуйтесь поиском по форуму:
9
08.01.2013, 22:47
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru