Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.12.07;
Скачать: CL | DM;

Вниз

Не пойму почему не работает...   Найти похожие ветки 

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

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

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

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


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


> в чем дело?


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


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

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


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

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

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


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

Делает она перебор всех перестановок байтов из 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:49) [5]


> mov edi, offset myvar


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

lea edi, myvar

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


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

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

lea edi, myvar

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


 
Сергей М. ©   (2008-10-29 14:36) [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:48) [8]

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


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

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


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

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

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


 
MBo ©   (2008-10-29 15:03) [11]

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


 
icWasya ©   (2008-10-29 15:17) [12]

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


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


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


   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



Страницы: 1 вся ветка

Текущий архив: 2008.12.07;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
2-1225198907
kate158
2008-10-28 16:01
2008.12.07
буфер,дбгрид,навигация по записям


15-1223209888
Dez3uk
2008-10-05 16:31
2008.12.07
таблицы в Word и Exel


2-1225113127
Nil
2008-10-27 16:12
2008.12.07
Зашифровать содержимое TStringList


2-1224855789
worldmen
2008-10-24 17:43
2008.12.07
Неполучается обрабоать кнопку TUpDown


2-1225433373
Sorry
2008-10-31 09:09
2008.12.07
Главная форма поверх остальных...