Форум программистов, компьютерный форум 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. Просмотров 2903. Ответов 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
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Форумчанин
Эксперт С++
 Аватар для Kastaneda
4253 / 2785 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 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
5763 / 4711 / 622
Регистрация: 10.07.2011
Сообщений: 14,190
Записей в блоге: 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
Модератор
6453 / 4919 / 451
Регистрация: 14.02.2011
Сообщений: 16,320
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
Модератор
6453 / 4919 / 451
Регистрация: 14.02.2011
Сообщений: 16,320
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
Еще ссылки по теме:

C++ Ошибка Access violation writing location
C++ Access violation writing location
C++ Код выдает ошибку Access violation writing location
C++ Unhandled exception at 0x0F73DF62 | 0xC0000005: Access violation writing location
Access violation writing location C++

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

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

Не по теме:

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

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

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