powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как перевести код Assembler в delphi?
25 сообщений из 35, страница 1 из 2
Как перевести код Assembler в delphi?
    #40078119
Ольга2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При разборе одного исходника на delphi7 попался код на assembler. Как его можно переделать на delphi? Вот пример кода на assembler.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
function FirstCharInBuffer(const C: Char; const Buffer,BufLen,StartPos: Integer): Integer;
asm
  //eax <-- C
  //edx <-- Buffer
  //ecx <-- BufLen

  //Comment out for speed. In this unit, it is impossible! But if you copy and
  //paste this function to other place, it is safe not comment out following 2
  //blocks

  //Buffer is NULL ?
  //test edx,edx
  //je @@Exit

  //BufLen <= 0 ?
  //cmp ecx,0
  //jle @@Exit

 //BufLen <= StartPos ?
  cmp ecx,StartPos
  jle @@Exit

  //if (BufLen <= StartPos) then
  //begin // over bounds
  //  Result := -1;
   // Exit;
 // end;

  //save register
  push edi

  mov edi,edx
  add edi,StartPos
  sub ecx,StartPos

@@Compare:
  //repne scasb, optimize for speed, 2001.11.6
  cmp al,[edi]
  je @@Found
  inc edi
  dec ecx
  test ecx,ecx
  jz @@NotFound
  jmp @@Compare

@@Found:
  mov eax,edi
  sub eax,edx

  //restore register
  pop edi
  jmp @@OK

@@NotFound:
  //restore register
  pop edi

@@Exit:
  xor eax,eax
  dec eax

@@OK:
end;


Я уже начала его переделывать, но не закончила, вот пример моего кода:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
function FirstCharInBuffer(const C: Char; const Buffer,BufLen,StartPos: Integer): Integer;
var
  P: PChar;
  Remain: Integer;
  Mpos:PChar;
  edi,ecx:Integer;
  CurrentLen: Integer;    
  CurrentByte: Byte;
  BufAsByte: Array of Byte absolute Buffer;
begin
   CurrentLen := StartPos;
   if (BufLen <= 0) or (BufLen <= StartPos) then
   begin // over bounds
    Result := -1;
    Exit;
   end;
   edi := Buffer;
   edi := edi+StartPos;
   ecx := BufLen-StartPos;
   while edi <= BufLen do
    CurrentByte := BufAsByte[edi];
  begin
      if(CurrentByte = edi)then
      begin
          inc(edi);
      end;
  end;
   Result := -1;
   Exit;
end;


Как assembler перевести в delphi7?
...
Рейтинг: 0 / 0
Как перевести код Assembler в delphi?
    #40078124
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ольга2Как его можно переделать на delphi?

Выкинуть полностью. В места, где он вызывался? поставить функцию StrScan.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как перевести код Assembler в delphi?
    #40078130
white_nigger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ольга2
Как assembler перевести в delphi7?
А зачем? Работает - не трожь!
...
Рейтинг: 0 / 0
Как перевести код Assembler в delphi?
    #40078147
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
white_nigger
Ольга2
Как assembler перевести в delphi7?
А зачем? Работает - не трожь!


потому что ей курсовик надо сдавать, но никто не поверит, что она что-то на ассемблере написала
...
Рейтинг: 0 / 0
Как перевести код Assembler в delphi?
    #40078241
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecatorникто не поверит, что она что-то на ассемблере написала

А на Дельфи как будто поверят?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как перевести код Assembler в delphi?
    #40078387
Ольга2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все понятно никто не знает.
...
Рейтинг: 0 / 0
Как перевести код Assembler в delphi?
    #40078389
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Ольга2
Все понятно никто не знает.


тебе ещё ночью сказали

Dimitry Sibiryakov

Выкинуть полностью. В места, где он вызывался? поставить функцию StrScan.
...
Рейтинг: 0 / 0
Как перевести код Assembler в delphi?
    #40078390
Ольга2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Странный какой-то форум вместо помощи высмеивают, пойду в другое место.
Выкинуть полностью. В места, где он вызывался? поставить функцию StrScan.
Что мне выкидывать я сама решу, но своего я добьюсь и переведу код с assembler'а в delphi7.
...
Рейтинг: 0 / 0
Как перевести код Assembler в delphi?
    #40078392
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Ольга2
Странный какой-то форум вместо помощи высмеивают, пойду в другое место.
Выкинуть полностью. В места, где он вызывался? поставить функцию StrScan.

Что мне выкидывать я сама решу, но своего я добьюсь и переведу код с assembler'а в delphi7.

счастливого пути !
...
Рейтинг: 0 / 0
Как перевести код Assembler в delphi?
    #40078397
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ольга2,

Твой код, который на асме - он что делает? Ищет первое вхождение символа (позицию) в некотором буфере? Ну так вместо буфера - строку и используй Pos() - будет тебе щастье.
...
Рейтинг: 0 / 0
Как перевести код Assembler в delphi?
    #40078398
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему у меня впечатление, что аффтарша нагуглила очередную библиотеку SOFT_FOR_YOU?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как перевести код Assembler в delphi?
    #40078412
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Ну еще есть Fast-чего-то там для строк - скорей всего оно оттуда.....

P.S. Pos() - он тоже на асме :)
...
Рейтинг: 0 / 0
Как перевести код Assembler в delphi?
    #40078425
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.

Ольга2
При разборе одного исходника на delphi7 попался код на assembler. Как его можно переделать на delphi? Вот пример кода на assembler.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
function FirstCharInBuffer(const C: Char; const Buffer,BufLen,StartPos: Integer): Integer;
asm
  //eax <-- C
  //edx <-- Buffer
  //ecx <-- BufLen

  //Comment out for speed. In this unit, it is impossible! But if you copy and
  //paste this function to other place, it is safe not comment out following 2
  //blocks

  //Buffer is NULL ?
  //test edx,edx
  //je @@Exit

  //BufLen <= 0 ?
  //cmp ecx,0
  //jle @@Exit

 //BufLen <= StartPos ?
  cmp ecx,StartPos
  jle @@Exit

  //if (BufLen <= StartPos) then
  //begin // over bounds
  //  Result := -1;
   // Exit;
 // end;

  //save register
  push edi

  mov edi,edx
  add edi,StartPos
  sub ecx,StartPos

@@Compare:
  //repne scasb, optimize for speed, 2001.11.6
  cmp al,[edi]
  je @@Found
  inc edi
  dec ecx
  test ecx,ecx
  jz @@NotFound
  jmp @@Compare

@@Found:
  mov eax,edi
  sub eax,edx

  //restore register
  pop edi
  jmp @@OK

@@NotFound:
  //restore register
  pop edi

@@Exit:
  xor eax,eax
  dec eax

@@OK:
end;


Я уже начала его переделывать, но не закончила, вот пример моего кода:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
function FirstCharInBuffer(const C: Char; const Buffer,BufLen,StartPos: Integer): Integer;
var
  P: PChar;
  Remain: Integer;
  Mpos:PChar;
  edi,ecx:Integer;
  CurrentLen: Integer;    
  CurrentByte: Byte;
  BufAsByte: Array of Byte absolute Buffer;
begin
   CurrentLen := StartPos;
   if (BufLen <= 0) or (BufLen <= StartPos) then
   begin // over bounds
    Result := -1;
    Exit;
   end;
   edi := Buffer;
   edi := edi+StartPos;
   ecx := BufLen-StartPos;
   while edi <= BufLen do
    CurrentByte := BufAsByte[edi];
  begin
      if(CurrentByte = edi)then
      begin
          inc(edi);
      end;
  end;
   Result := -1;
   Exit;
end;


Как assembler перевести в delphi7?


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
function FirstCharInBuffer( const C : AnsiChar; const Buffer, BufLen, StartPos : integer ) : integer;
var
  i : integer;
begin
  Result := -1;

  for i := StartPos to BufLen do
    if pAnsiChar( Buffer + i )^ = c then
    begin
      Result := i;
      break;
    end;
end;
...
Рейтинг: 0 / 0
Как перевести код Assembler в delphi?
    #40078430
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesov,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
function FirstCharInBuffer( const C : AnsiChar; const Buffer, BufLen, StartPos : integer ) : integer;
var
  i : integer;
begin
  for i := StartPos to BufLen do
    if pAnsiChar( Buffer + i )^ = c then
    begin
      Result := i;
      Exit;
    end;

  Result := -1;
end;
...
Рейтинг: 0 / 0
Как перевести код Assembler в delphi?
    #40078432
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,
оптимизация - это уже следующий шаг ))
...
Рейтинг: 0 / 0
Как перевести код Assembler в delphi?
    #40078533
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rgreat,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
function FirstCharInBuffer( const C : AnsiChar; const Buffer, BufLen, StartPos : integer ) : integer;
begin
  for Result := StartPos to BufLen do begin
    if pAnsiChar( Buffer + Result)^ = c then
      Exit;
  end;
  Result := -1;
end;
...
Рейтинг: 0 / 0
Как перевести код Assembler в delphi?
    #40078557
delphinotes
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
_Vasilisk_
rgreat,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
function FirstCharInBuffer( const C : AnsiChar; const Buffer, BufLen, StartPos : integer ) : integer;
begin
  for Result := StartPos to BufLen do begin
    if pAnsiChar( Buffer + Result)^ = c then
      Exit;
  end;
  Result := -1;
end;




like
...
Рейтинг: 0 / 0
Как перевести код Assembler в delphi?
    #40078561
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я ассемблер не особо знаю. Судя по другой теме ТС, есть предположение, что объявление функции может быть неточно приведено, что должно быть не
Код: pascal
1.
function FirstCharInBuffer( const C : AnsiChar; const Buffer, BufLen, StartPos : integer ) : integer;


а
Код: pascal
1.
function FirstCharInBuffer(const C: Char; const Buffer; BufLen, StartPos: Integer): Integer;


Кто понимает, код на asm допускает такое? Мне кажется да, но не уверен.
...
Рейтинг: 0 / 0
Как перевести код Assembler в delphi?
    #40078565
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62
что должно быть не
Нет. Там именно побайтовое сравнение
Ольга2
Код: pascal
1.
2.
3.
cmp al, [edi]
je @@Found
inc edi

Размер al - один байт
...
Рейтинг: 0 / 0
Как перевести код Assembler в delphi?
    #40078567
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,

я так понимаю, что нетипизированный const параметр передается, как указатель (в документации не нашел, посмотреть на примере пока не сделал). Т.е., что в варианте ТС, где подразумевается, что Buffer - указатель (объявлен как integer), что в случае untyped, в edx будет одно и то же, нет?
ТС
Код: pascal
1.
2.
3.
4.
5.
function FirstCharInBuffer(const C: Char; const Buffer,BufLen,StartPos: Integer): Integer;
asm
  //eax <-- C
  //edx <-- Buffer
  //ecx <-- BufLen
...
Рейтинг: 0 / 0
Как перевести код Assembler в delphi?
    #40078588
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62
в edx будет одно и то же, нет?
Нет.
Код: pascal
1.
2.
3.
4.
5.
6.
procedure Test1(const AArg: Integer);
procedure Test2(const AArg);

v := 5;
Test1(v);  // eax = v = 5
Test2(v);  // eax = @v
...
Рейтинг: 0 / 0
Как перевести код Assembler в delphi?
    #40078591
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_,
Но в качестве аргумента в функцию, приведенную ТС как раз и надо передавать адрес буфера, по смыслу. И все реализации на паскале, которые тут привели, это и подразумевают. Т.е. в функции с нетипизированным параметром мы передадим как аргумент саму переменную-буфер, а в вариантах Полесова и дальнейших модификациях в качестве аргумента надо передавать адрес буфера с данными. Так что в регистре одно и то же и будет.
...
Рейтинг: 0 / 0
Как перевести код Assembler в delphi?
    #40078597
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62

Но в качестве аргумента в функцию, приведенную ТС как раз и надо передавать адрес буфера


Код: pascal
1.
2.
3.
procedure BlahBlah( const Buff : integer ); 

procedure BlahBlah( const Buff : pointer ); 


В обоих вариантах в качестве параметра передается одно и тоже целочисленное значение, приведенное к разным типам.

Мы же можем преобразовать указатель:
Код: pascal
1.
  IntVar := integer( pointer )
...
Рейтинг: 0 / 0
Как перевести код Assembler в delphi?
    #40078599
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_, Polesov,
в общем, я предполагаю, как выше писал, что в оригинале объявление функции выглядит не так, как у ТС, а вот так:
Код: pascal
1.
function FirstCharInBuffer(const C: Char; const Buffer; BufLen, StartPos: Integer): Integer;


Мы общаемся удаленно, а так был бы готов поставить бутылку пива, что это так. :)
...
Рейтинг: 0 / 0
Как перевести код Assembler в delphi?
    #40078601
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
s62
_Vasilisk_, Polesov,
в общем, я предполагаю, что в оригинале объявление функции выглядит не так, как у ТС, а вот так:
Код: pascal
1.
function FirstCharInBuffer(const C: Char; const Buffer; BufLen, StartPos: Integer): Integer;


Мы общаемся удаленно, а так был бы готов поставить бутылку пива, что это так. :)


Тип AnsiChar используется исходя из того, что ТС указал Delphi-7.
В неюникодных Delphi Char и AnsiChar (pChar и pAnsiChar) - это одно и тоже.
...
Рейтинг: 0 / 0
25 сообщений из 35, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как перевести код Assembler в delphi?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]