IPB
ЛогинПароль:

> ПРАВИЛА РАЗДЕЛА!!!

1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!

 
 Ответить  Открыть новую тему 
> Передача параметров в функции
сообщение
Сообщение #1


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


procedure       _Pos{ substr : ShortString; s : ShortString ) : Integer};
asm
{ ->EAX Pointer to substr }
{ EDX Pointer to string }
{ <-EAX Position of substr in s or 0 }

PUSH EBX
PUSH ESI
PUSH EDI

MOV ESI,EAX { Point ESI to substr }
MOV EDI,EDX { Point EDI to s }

XOR ECX,ECX { ECX = Length(s) }
MOV CL,[EDI]
INC EDI { Point EDI to first char of s }

PUSH EDI { remember s position to calculate index }

XOR EDX,EDX { EDX = Length(substr) }
MOV DL,[ESI]
INC ESI { Point ESI to first char of substr }

DEC EDX { EDX = Length(substr) - 1 }
JS @@fail { < 0 ? return 0 }
MOV AL,[ESI] { AL = first char of substr }
INC ESI { Point ESI to 2'nd char of substr }

SUB ECX,EDX { #positions in s to look at }
{ = Length(s) - Length(substr) + 1 }
JLE @@fail
@@loop:
REPNE SCASB
JNE @@fail
MOV EBX,ECX { save outer loop counter }
PUSH ESI { save outer loop substr pointer }
PUSH EDI { save outer loop s pointer }

MOV ECX,EDX
REPE CMPSB
POP EDI { restore outer loop s pointer }
POP ESI { restore outer loop substr pointer }
JE @@found
MOV ECX,EBX { restore outer loop counter }
JMP @@loop

@@fail:
POP EDX { get rid of saved s pointer }
XOR EAX,EAX
JMP @@exit

@@found:
POP EDX { restore pointer to first char of s }
MOV EAX,EDI { EDI points of char after match }
SUB EAX,EDX { the difference is the correct index }
@@exit:
POP EDI
POP ESI
POP EBX
end;

Почему у нас получается фактически _pos(EAX,EDX):EAX ?


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Знаток
****

Группа: Пользователи
Сообщений: 408
Пол: Мужской

Репутация: -  3  +


ради интереса - а откуда ето =)))


--------------------
- Где я?
- Во тьме.
- В какой тьме?
- Во тьме твоего мозга.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


это стандартная процедура POS так работает..

всмысле этопроцедура аналог функции POS smile.gif


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4





Группа: Пользователи
Сообщений: 9
Пол: Мужской

Репутация: -  0  +


Может вы просто неправильно ее вызывали. Потому что сама функция работает правильно. Вот пример вызыва:

var
 Form1: TForm1;
 st1, st2 : ShortString;

implementation

{$R *.dfm}

function    _Pos: integer;
asm
{     ->EAX     Pointer to substr               }
{       EDX     Pointer to string               }
{     <-EAX     Position of substr in s or 0    }

       PUSH    EBX
       PUSH    ESI
       PUSH    EDI

       MOV     ESI,EAX { Point ESI to substr           }
       MOV     EDI,EDX { Point EDI to s                }

       XOR     ECX,ECX { ECX = Length(s)               }
       MOV     CL,[EDI]
       INC     EDI             { Point EDI to first char of s  }

       PUSH    EDI             { remember s position to calculate index        }

       XOR     EDX,EDX { EDX = Length(substr)          }
       MOV     DL,[ESI]
       INC     ESI             { Point ESI to first char of substr     }

       DEC     EDX             { EDX = Length(substr) - 1              }
       JS      @@fail  { < 0 ? return 0                        }
       MOV     AL,[ESI]        { AL = first char of substr             }
       INC     ESI             { Point ESI to 2'nd char of substr      }

       SUB     ECX,EDX { #positions in s to look at    }
                       { = Length(s) - Length(substr) + 1      }
       JLE     @@fail
@@loop:
       REPNE   SCASB
       JNE     @@fail
       MOV     EBX,ECX { save outer loop counter               }
       PUSH    ESI             { save outer loop substr pointer        }
       PUSH    EDI             { save outer loop s pointer             }

       MOV     ECX,EDX
       REPE    CMPSB
       POP     EDI             { restore outer loop s pointer  }
       POP     ESI             { restore outer loop substr pointer     }
       JE      @@found
       MOV     ECX,EBX { restore outer loop counter    }
       JMP     @@loop

@@fail:
       POP     EDX             { get rid of saved s pointer    }
       XOR     EAX,EAX
       JMP     @@exit

@@found:
       POP     EDX             { restore pointer to first char of s    }
       MOV     EAX,EDI { EDI points of char after match        }
       SUB     EAX,EDX { the difference is the correct index   }
@@exit:
       POP     EDI
       POP     ESI
       POP     EBX
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 st1 := 'Hello';
 st2 := 'weeHelloyyy';
 asm
    mov eax, offset st1
    mov edx, offset st2
 end;
 Label1.Caption := IntToStr(_pos);
end;


Я в ней ничего не менял, кроме того, что объявил ее как функцию. Разницы нет, так как результат типа integer всегда возвращается в eax.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Ищущий истину
******

Группа: Пользователи
Сообщений: 4 825
Пол: Мужской
Реальное имя: Олег

Репутация: -  45  +


вопрос снят.


--------------------
Помогая друг другу, мы справимся с любыми трудностями!
"Не опускать крылья!" (С)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 26.04.2024 22:54
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name