Главная страница
    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.042 c
8-1154023549
S0ldier
2006-07-27 22:05
2007.04.22
Захват звука


1-1172141459
Gin2
2007-02-22 13:50
2007.04.22
GetPropValue для IInterface


15-1174885995
Тульский
2007-03-26 09:13
2007.04.22
Экспорт из MS SQL в PostgreSQL


15-1174459271
Knight
2007-03-21 09:41
2007.04.22
Пользующим DMClient...


2-1175249695
Merry
2007-03-30 14:14
2007.04.22
Копия базы *.gdb





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