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

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

вставка на ассемблере


sat ©   (2007-04-01 18:16:00) 

помогите отладить пожалуйста вставку в Delphi на ассемблере

смысл задачи задается произвольный массив и в нем ищется индекс 0
если 0 есть переменно result:=1 иначе -1


var
 mas : array of integer;  //массив содерж элементы
 i , count , result : integer;  //счетчик и кол-во элементов
begin
repeat                                         //ввод массива
 writeln('Enter the element count>0');
 readln(count);
until  count > 0 ;
setlength(mas , count);
for i := 0 to count-1 do
begin
 writeln('Enter ',i+1,' element');
 readln(mas[i]);
end;
for i := 0 to count-1 do
begin
 write(mas[i],' ');
end;
asm
  xor ebx , ebx  //смещение текущего элемента относительно начала массива

  mov ecx , count //количество проходов цикла
  @m1:
   cmp mas[ebx] , 0 //сравниваю текущий элемент на 0
   je @ok //если 0 то переходим на метку 0
   add ebx , 4 //если увеличиваем смещение элемента
   cmp ecx  , 1 //проверка если не будет 0 в массиве
   je @_ok
  loop @m1

  @ok:
   mov result , 1
   jmp @exit

  @_ok:
   mov result , -1

  @exit:

end;

writeln;
writeln(result);
readln;
end.


Sha   (2007-04-01 23:48:00) [1]

ebx сохранять надо, см. хелп.

можно примерно так:

procedure TForm1.Button1Click(Sender: TObject);
var
 mas: array of integer;
 res, len: integer;
begin
 len:=3;
 SetLength(mas,len);
 mas[0]:=0; mas[1]:=1; mas[2]:=2;
 asm
   mov edx,mas
   mov eax,len
@next:
   add eax,-1
   jl  @done
   cmp [edx+4*eax],0
   jne @next
   mov eax,1
@done:
   mov res,eax
 end;
 ShowMessage(IntToStr(res));
end;


sat   (2007-04-01 22:15:00) [2]

попробывал дело не в регистрах
мне кажется что главная проблемма в сравнении cmp mas[ebx] , 0 почему то когда элемент массива 0 не переходит на метку


Alexey (AZ)   (2007-04-01 19:01:00) [3]

Не совсем ясна задача, но попробую предположить что нужно сохранить регистры на входе и восстановить на выходе.
asm PUSHAD end;
и
asm POPAD end;
Сохранит все регистры, но из того что используется надо сохранять только EBX поэтому можно сделать проще:
asm push ebx end;
&
asm pop ebx end;


Наверх

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