Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Не пойму почему не работает... [D7, XP]


Костик ©   (2008-10-29 13:25:00) 

Такая конструкция

pкocedure Asd();
var
 myvar: array [0..255] of byte;  
begin
myvar[i] := 0;
  asm
    pushad
    mov edi, offset myvar
..................

выдает ошибку обращения к адресу...
елси myvar сделать глобальлной, то все работает, а крайне надо видет ее только во процедуре...
Может подскажите в чем дело? Заранее благодарю


Костик   (2008-10-29 15:22:00) [1]


> Ну рассказывай про "глюканы")..
>
> С подробным кодом и комментариями, ессно ..


   lea edi, offset myvar
   lea ebx, offset myvar2

//myvar2[0] := 65;
//myvar2[65] := ;
//myvar2[66] := 127;
допустим проинициализировали myvar
65 65 65
после запуска цикла
врезультате первой итерации в ней оказыватся вместо  66 65 65  
128 127 127


icWasya   (2008-10-29 15:17:00) [2]

ну а вот это что такое ?
movzx eax,byte ptr [ myvar2+ eax]
может быть имелось ввиду
movzx eax,byte ptr [ ebp+ eax]


MBo   (2008-10-29 15:03:00) [3]

>Делает она перебор всех перестановок байтов из myvar2 в myvar
А что это означает?


Сергей М.   (2008-10-29 14:59:00) [4]

Ну рассказывай про "глюканы")..

С подробным кодом и комментариями, ессно ..


Костик   (2008-10-29 14:55:00) [5]

...неа, какие то глюканы появляются.... если в myvar больше двух елементов


Костик   (2008-10-29 14:48:00) [6]

ага, точно. Благодарю...


Сергей М.   (2008-10-29 14:36:00) [7]


> так можно локальные переменные применить?


Конечно !

LEA = Load Effective Address

Это как раз то что тебе нужно.

А смещение лок.переменной компилятор трактует относительно тек.содержимого ebp

Т.е.

lea edi, myvar


по целевой задаче эквивалентна

lea edi, ebp + offset myvar

или

mov edi, offset myvar
add edi, ebp


Костик   (2008-10-29 14:01:00) [8]

//тут условие выхода
услови долго было набирать... :)

lea edi, myvar

а так можно локальные переменные применить?


Сергей М.   (2008-10-29 13:49:00) [9]


> mov edi, offset myvar


Вот так будет правильно:

lea edi, myvar

А почему цикл бесконечный ?
Не вижу выхода из цикла ..


Костик   (2008-10-29 13:41:00) [10]

Делает она перебор всех перестановок байтов из myvar2 в myvar

pкocedure Asd();
var
myvar: array [0..255] of byte;  
myvar2: array [0..255] of byte;  
begin
//Инициализация
//например
//myvar2[0] := 65;
//myvar2[65] := 66;
//myvar[0] := 0;
//myvar[1] := 0;
.............

while(TRUE) do
begin
  asm
    pushad
    mov edi, offset myvar
    mov ebx, offset myvar2
    L1: movzx eax, byte ptr [edi]
    movzx eax,byte ptr [myvar2 + eax]
    cmp al, 0    
    je L3
    mov [edi], al  
    jmp L5

    L3: movzx eax, byte ptr [myvar2 + eax]
    mov [edi],al
    inc edi
    jmp L1

    L5: popad
  end;
//тут условие выхода
end;


Сергей М.   (2008-10-29 13:33:00) [11]

Ты лучше изложи целиком задачу этой процедуры ..

Наверняка найдется оптимальное и правильное решение даже с лок.переменной ..


Костик   (2008-10-29 13:30:00) [12]

а можно как то передать ссылку на нее если уж она глобальная в эту процедуру


Сергей М.   (2008-10-29 13:28:00) [13]


> в чем дело?


В том что myvar локальная и размещена в стеке.


Наверх

Титульная страница Поиск, карта сайта Написать письмо