Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как перевести код Assembler в delphi? / 25 сообщений из 35, страница 1 из 2
17.06.2021, 00:00
    #40078119
Ольга2
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перевести код Assembler в delphi?
При разборе одного исходника на 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
17.06.2021, 00:25
    #40078124
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перевести код Assembler в delphi?
Ольга2Как его можно переделать на delphi?

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


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

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


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

Dimitry Sibiryakov

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

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

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

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

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

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

Ольга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
17.06.2021, 22:51
    #40078430
rgreat
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перевести код Assembler в delphi?
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
17.06.2021, 22:55
    #40078432
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перевести код Assembler в delphi?
rgreat,
оптимизация - это уже следующий шаг ))
...
Рейтинг: 0 / 0
18.06.2021, 11:36
    #40078533
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перевести код Assembler в delphi?
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
18.06.2021, 12:35
    #40078557
delphinotes
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перевести код Assembler в delphi?
_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
18.06.2021, 12:45
    #40078561
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перевести код Assembler в delphi?
Я ассемблер не особо знаю. Судя по другой теме ТС, есть предположение, что объявление функции может быть неточно приведено, что должно быть не
Код: 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
18.06.2021, 13:02
    #40078565
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перевести код Assembler в delphi?
s62
что должно быть не
Нет. Там именно побайтовое сравнение
Ольга2
Код: pascal
1.
2.
3.
cmp al, [edi]
je @@Found
inc edi

Размер al - один байт
...
Рейтинг: 0 / 0
18.06.2021, 13:10
    #40078567
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перевести код Assembler в delphi?
_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
18.06.2021, 14:17
    #40078588
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перевести код Assembler в delphi?
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
18.06.2021, 14:23
    #40078591
s62
s62
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перевести код Assembler в delphi?
_Vasilisk_,
Но в качестве аргумента в функцию, приведенную ТС как раз и надо передавать адрес буфера, по смыслу. И все реализации на паскале, которые тут привели, это и подразумевают. Т.е. в функции с нетипизированным параметром мы передадим как аргумент саму переменную-буфер, а в вариантах Полесова и дальнейших модификациях в качестве аргумента надо передавать адрес буфера с данными. Так что в регистре одно и то же и будет.
...
Рейтинг: 0 / 0
18.06.2021, 14:38
    #40078597
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перевести код Assembler в delphi?
s62

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


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

procedure BlahBlah( const Buff : pointer ); 


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

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


Мы общаемся удаленно, а так был бы готов поставить бутылку пива, что это так. :)
...
Рейтинг: 0 / 0
18.06.2021, 14:46
    #40078601
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как перевести код Assembler в delphi?
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
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как перевести код Assembler в delphi? / 25 сообщений из 35, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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