Главная страница
    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.45 MB
Время: 0.029 c
15-1175194588
roamer
2007-03-29 22:56
2007.04.22
Delphi и 1С:Предприятие. Программирование информационного обмена


2-1175512529
Dmitry_177
2007-04-02 15:15
2007.04.22
отобразить все файлы находящиеся в папке


2-1175108515
Углук
2007-03-28 23:01
2007.04.22
Что быстрее? Чарт или директиИксовский канвас?


9-1145552442
JF
2006-04-20 21:00
2007.04.22
Материал в OGL


10-1131624226
Ruslanyd
2005-11-10 15:03
2007.04.22
Подключение к открытому файлу *.xls





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский