Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.04.22;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.45 MB
Время: 0.04 c
2-1175316917
Roman_S
2007-03-31 08:55
2007.04.22
Складной? Label


2-1175116663
Kostafey
2007-03-29 01:17
2007.04.22
dll, TForm.close, память, etc


2-1175171612
Stanislav
2007-03-29 16:33
2007.04.22
Сохранить TSTringList в Юникоде


15-1174843678
leonidus
2007-03-25 21:27
2007.04.22
Помогите написать алгоритм перебора


2-1175678391
sergeyst
2007-04-04 13:19
2007.04.22
Версия программы





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский