Форум: "Начинающим";
Текущий архив: 2008.12.07;
Скачать: [xml.tar.bz2];
ВнизНе пойму почему не работает... Найти похожие ветки
← →
Костик (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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c