![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Не пойму почему не работает... [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 локальная и размещена в стеке.