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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 23, средняя оценка - 4.70
pepepe
0 / 0 / 0
Регистрация: 08.01.2013
Сообщений: 3
08.01.2013, 21:52     __asm ошибка Access violation writing location #1
Код ниже выводит следующую ошибку
"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
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2013, 21:52     __asm ошибка Access violation writing location
Посмотрите здесь:

C++ Access violation writing location
Непонятная ошибка "Access violation writing location 0xcdcdcdd5" C++
Исключение Access violation writing location 0x0582D000 C++
C++ Ошибка "Unhandled exception, Access violation writing location"
ошибка Access violation reading location 0x00000066 C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
08.01.2013, 22:13     __asm ошибка Access violation writing location #2
Советую перед началом выполнения ассемблерной вставки сохранять все используемые регистры и восстанавливать их после выполнения нужного кода, это во первых. А во вторых регистр ebp используется для организации стек фрейма, поэтому его вообще менять нельзя. Думаю проблема как раз в этом.

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

Добавлено через 9 минут
Вот нашел хорошую статью на эту тему.
Psilon
Master of Orion
 Аватар для Psilon
5738 / 4686 / 619
Регистрация: 10.07.2011
Сообщений: 14,160
Записей в блоге: 5
Завершенные тесты: 4
08.01.2013, 22:19     __asm ошибка Access violation writing location #3
по-моему там AT&T синтаксис, так что не стоит вчитываться в асмовский код, если у вас был только x86
Kastaneda
08.01.2013, 22:21
  #4

Не по теме:

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

ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
08.01.2013, 22:31     __asm ошибка Access violation writing location #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 то добавь
Psilon
08.01.2013, 22:31
  #6

Не по теме:

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

ValeryS
Модератор
6376 / 4842 / 442
Регистрация: 14.02.2011
Сообщений: 16,045
08.01.2013, 22:34     __asm ошибка Access violation writing location #7
Цитата Сообщение от pepepe Посмотреть сообщение
mov ebp, num
используй ebx как правильно заметили ebp часто работает со стеком в результате при выходе может улететь в космос
pepepe
0 / 0 / 0
Регистрация: 08.01.2013
Сообщений: 3
08.01.2013, 22:44  [ТС]     __asm ошибка Access violation writing location #8
Цитата Сообщение от Kastaneda Посмотреть сообщение
Советую перед началом выполнения ассемблерной вставки сохранять все используемые регистры и восстанавливать их после выполнения нужного кода, это во первых. А во вторых регистр ebp используется для организации стек фрейма, поэтому его вообще менять нельзя. Думаю проблема как раз в этом.

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

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

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

Добавлено через 44 секунды
Цитата Сообщение от ValeryS Посмотреть сообщение
используй ebx как правильно заметили ebp часто работает со стеком в результате при выходе может улететь в космос
да, так и сделал только что.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.01.2013, 22:47     __asm ошибка Access violation writing location
Еще ссылки по теме:

Ошибка "Access violation writing location" при работе с массивом. C++
C++ Ошибка компилятора: "Access violation writing location"
C++ Ошибка Access violation writing location

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

Или воспользуйтесь поиском по форуму:
Kastaneda
08.01.2013, 22:47     __asm ошибка Access violation writing location
  #9

Не по теме:

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

Yandex
Объявления
08.01.2013, 22:47     __asm ошибка Access violation writing location
Ответ Создать тему
Опции темы

Текущее время: 13:24. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru