Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2010, 18:18   #1
Mixasik
New Delphi Coder
Форумчанин Подтвердите свой е-майл
 
Аватар для Mixasik
 
Регистрация: 20.07.2008
Сообщений: 874
По умолчанию Ассемблерная вставка в Delphi

Доброго времени суток. Возникла необходимость по учебе использовать asm вставку в Delphi, но не работает У меня есть:
Код:
Tarray = array of integer;
***
oa : TArray;
***
    mov ax , 5
    mov edi, offset oa
    mov cx, 5
    @s:
      sub [edi], ax
      add edi, 2
    loop @s
Вылетает ошибка Access violation Подскажите что я не так делаю?
p.s Массив не пустой и в нем точно больше 5 элементов.
Страх это слабость и потому, кто испугался уже побежден.

Последний раз редактировалось Mixasik; 29.01.2010 в 18:22.
Mixasik вне форума Ответить с цитированием
Старый 29.01.2010, 19:48   #2
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

ну Вы и смелый человек...
А кто Вам сказал, что так можно?!
Дело в том, динамический массив - это УКАЗАТЕЛЬ.
Причём, пока не выполнили SetLength - указатель "В НИКУДА"...
Вы уверены, что Вам нужен именно динамический массив?!?

p.s. что такое динамический массив "изнутри" посмотрите в книжке Стив Тейксейра, Ксавье Пачеко. "Borland Delphi 5. Руководство разработчика"
Serge_Bliznykov вне форума Ответить с цитированием
Старый 29.01.2010, 22:26   #3
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Код:
mov ax , 5
    mov edi, offset oa
    mov cx, 5
    @s:
      sub [edi], ax
      add edi, 2
    loop @s
делает вот что

Код:
edi := oa;
while(cx > 0) do
begin
  edi := Pointer(Integer(edi) - 5); // вообще не пойму почему 5, и почему минус?
  edit := Pointer(Integer(edi) + 2); // очень у кого-то математика страдает :)
  cx := cx - 1;
end;
Где тут какая либо логика, я не наблюдаю вообще (ну кроме цикла )
BOBAH13 вне форума Ответить с цитированием
Старый 30.01.2010, 00:45   #4
Mixasik
New Delphi Coder
Форумчанин Подтвердите свой е-майл
 
Аватар для Mixasik
 
Регистрация: 20.07.2008
Сообщений: 874
По умолчанию

Код:
  asm
    mov edi, oa     // Получаем адрес первого элемента массива
    mov ax, key     // Передаем ключ в регистр
    mov cx, leng    // Передаем число элементов в регистр
@s_crypt:           // Метка цикла шифрования
      add [edi], ax // Увеличиваем на ключ
      add edi, 2    // Переходим на следующий элемент массива
      dec cx        // Уменьшаем на единицу значение
      cmp cx, 0     // Псевдо вычитание
jnz @s_crypt        // Если не равно нулю, повторим
  end;
Вот так заработало, насчет адреса я понял, но и как вы писали не работало Но как только заменил цикл на ручную проверку и прыжок все заработало.
Страх это слабость и потому, кто испугался уже побежден.
Mixasik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ассемблерная вставка Arigato Общие вопросы Delphi 1 25.10.2009 21:47
Вставка кода в Delphi 2009 Lich Общие вопросы Delphi 1 29.12.2008 14:15
3d объекты в Delphi 7 - программирование и вставка Unweather Помощь студентам 1 26.11.2008 14:48
Почему отличаются результаты (Ассемблерная вставка в С++)? Объясните Vasiliusis Общие вопросы C/C++ 3 13.11.2008 19:17
Вставка по динамической памяти в Delphi Schakhmaev Помощь студентам 1 24.06.2008 01:27