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

Вниз

вставка на ассемблере   Найти похожие ветки 

 
sat ©   (2007-04-01 18:16) [0]

помогите отладить пожалуйста вставку в 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.



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

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


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

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


 
Sha ©   (2007-04-01 23:48) [3]

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;



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

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

Наверх




Память: 0.47 MB
Время: 0.044 c
1-1172248379
_Гость_
2007-02-23 19:32
2007.04.22
ToolButton в рантайм


2-1175671186
Gentos
2007-04-04 11:19
2007.04.22
Глобальная переменная


8-1154706561
alex_bog
2006-08-04 19:49
2007.04.22
Как во время запуска плеера воспроизвести более одного файла?


8-1154023549
S0ldier
2006-07-27 22:05
2007.04.22
Захват звука


11-1154888270
Александра
2006-08-06 22:17
2007.04.22
OnFocus для EditBox