» TeamX (Архив Форума)«


Форум TeamX » Исследования » Вызов процедуры

Переход по темам
<< Пред. След. >>
Единственная страница этой темы

 
Anchorite
Пользователь

Откуда: Не здесь
Регистрация: Янв. 2003

Всего: 283 сообщения

Возможно это все знают, но для меня это было неожиданно.

Оказывается внутри скрипта процедуру можно вызвать тремя разными способами:

Код:
 
procedure start
begin
end


procedure sum(variable arg0, variable arg1, variable arg2)
begin
   return arg0 + arg1 + arg2;
end

procedure Test
begin
   variable strVar;
   variable result;

   /* Способ 1 */
   result := sum(3, 7, 15);

   /* Способ 2 */
   result := "sum"(3, 7, 15);

   /* Способ 3 */
   strVar := "sum";
   result := strVar(3, 7, 15);
end



Для первого способа генерится самый короткий код, для  третьего самый длинный.

Дамп откомпилированного скрипта приведен ниже:

Код:
 
============== Procedures table ==================

======== Procedure 0 ========
Name offset:       0x00000006
Type:              0x00000000  // No special types
Time:              0x00000000  // 0
Expression offset: 0x00000000
Body offset:       0x000000DE
Number of args:    0x00000000  // 0

======== Procedure 1 ========
Name offset:       0x00000018
Type:              0x00000000  // No special types
Time:              0x00000000  // 0
Expression offset: 0x00000000
Body offset:       0x000000DE
Number of args:    0x00000000  // 0

======== Procedure 2 ========
Name offset:       0x00000020
Type:              0x00000000  // No special types
Time:              0x00000000  // 0
Expression offset: 0x00000000
Body offset:       0x000000F8
Number of args:    0x00000003  // 3

======== Procedure 3 ========
Name offset:       0x00000026
Type:              0x00000000  // No special types
Time:              0x00000000  // 0
Expression offset: 0x00000000
Body offset:       0x0000013A
Number of args:    0x00000000  // 0



============== Namespace ==================
0x00000006: ".............."
0x00000018: "start"
0x00000020: "sum"
0x00000026: "Test"
==================
4 item(s)


============== Stringspace ==================
0x00000006: "sum"
==================
1 item(s)


============== Global variables values ==================
Not found


============== Exported variables ==================
Not found


============== Procedures ==================

0: .............. (0x000000de)
===============================

1: start (0x000000de)
===============================
0x000000DE: 0x802B            - O_PUSH_BASE

0x000000E0: 0xC001 0x00000000 - O_INTOP(0x00000000)   // 0 (0)
0x000000E6: 0x800D            - O_D_TO_A
0x000000E8: 0x8019            - O_SWAPA
0x000000EA: 0x802A            - O_POP_TO_BASE
0x000000EC: 0x8029            - O_POP_BASE
0x000000EE: 0x800C            - O_A_TO_D
0x000000F0: 0x801C            - O_POP_RETURN

0x000000F2: 0x802A            - O_POP_TO_BASE
0x000000F4: 0x8029            - O_POP_BASE
0x000000F6: 0x801C            - O_POP_RETURN

2: sum (0x000000f8)
===============================
0x000000F8: 0x802B            - O_PUSH_BASE

0x000000FA: 0xC001 0x00000000 - O_INTOP(0x00000000)   // 0 (0)
0x00000100: 0x8032            - O_FETCH
0x00000102: 0xC001 0x00000001 - O_INTOP(0x00000001)   // 1 (1)
0x00000108: 0x8032            - O_FETCH
0x0000010A: 0x8039            - O_ADD
0x0000010C: 0xC001 0x00000002 - O_INTOP(0x00000002)   // 2 (2)
0x00000112: 0x8032            - O_FETCH
0x00000114: 0x8039            - O_ADD
0x00000116: 0x800D            - O_D_TO_A
0x00000118: 0x8019            - O_SWAPA
0x0000011A: 0x802A            - O_POP_TO_BASE
0x0000011C: 0x8029            - O_POP_BASE
0x0000011E: 0x800C            - O_A_TO_D
0x00000120: 0x801C            - O_POP_RETURN

0x00000122: 0xC001 0x00000000 - O_INTOP(0x00000000)   // 0 (0)
0x00000128: 0x800D            - O_D_TO_A
0x0000012A: 0x8019            - O_SWAPA
0x0000012C: 0x802A            - O_POP_TO_BASE
0x0000012E: 0x8029            - O_POP_BASE
0x00000130: 0x800C            - O_A_TO_D
0x00000132: 0x801C            - O_POP_RETURN

0x00000134: 0x802A            - O_POP_TO_BASE
0x00000136: 0x8029            - O_POP_BASE
0x00000138: 0x801C            - O_POP_RETURN

3: Test (0x0000013a)
===============================
0x0000013A: 0x802B            - O_PUSH_BASE

0x0000013C: 0xC001 0x00000000 - O_INTOP(0x00000000)   // 0 (0)
0x00000142: 0xC001 0x00000000 - O_INTOP(0x00000000)   // 0 (0)
0x00000148: 0xC001 0x00000170 - O_INTOP(0x00000170)   // 368 (368)
0x0000014E: 0x800D            - O_D_TO_A
0x00000150: 0xC001 0x00000003 - O_INTOP(0x00000003)   // 3 (3)
0x00000156: 0xC001 0x00000007 - O_INTOP(0x00000007)   // 7 (7)
0x0000015C: 0xC001 0x0000000f - O_INTOP(0x0000000f)   // 15 (15)
0x00000162: 0xC001 0x00000003 - O_INTOP(0x00000003)   // 3 (3)
0x00000168: 0xC001 0x00000002 - O_INTOP(0x00000002)   // 2 (2)
0x0000016E: 0x8005            - O_CALL
0x00000170: 0xC001 0x00000001 - O_INTOP(0x00000001)   // 1 (1)
0x00000176: 0x8031            - O_STORE


0x00000178: 0xC001 0x000001ac - O_INTOP(0x000001ac)   // 428 (428)
0x0000017E: 0x800D            - O_D_TO_A
0x00000180: 0xC001 0x00000003 - O_INTOP(0x00000003)   // 3 (3)
0x00000186: 0xC001 0x00000007 - O_INTOP(0x00000007)   // 7 (7)
0x0000018C: 0xC001 0x0000000f - O_INTOP(0x0000000f)   // 15 (15)
0x00000192: 0xC001 0x00000003 - O_INTOP(0x00000003)   // 3 (3)
0x00000198: 0x9001 0x00000006 - O_STRINGOP(0x00000006)   // 6 (6)
0x0000019E: 0x8028            - O_LOOKUP_STRING_PROC
0x000001A0: 0x801B            - O_DUP
0x000001A2: 0xC001 0x00000003 - O_INTOP(0x00000003)   // 3 (3)
0x000001A8: 0x8027            - O_CHECK_ARG_COUNT
0x000001AA: 0x8005            - O_CALL
0x000001AC: 0xC001 0x00000001 - O_INTOP(0x00000001)   // 1 (1)
0x000001B2: 0x8031            - O_STORE


0x000001B4: 0x9001 0x00000006 - O_STRINGOP(0x00000006)   // 6 (6)
0x000001BA: 0xC001 0x00000000 - O_INTOP(0x00000000)   // 0 (0)
0x000001C0: 0x8031            - O_STORE

0x000001C2: 0xC001 0x000001f8 - O_INTOP(0x000001f8)   // 504 (504)
0x000001C8: 0x800D            - O_D_TO_A
0x000001CA: 0xC001 0x00000003 - O_INTOP(0x00000003)   // 3 (3)
0x000001D0: 0xC001 0x00000007 - O_INTOP(0x00000007)   // 7 (7)
0x000001D6: 0xC001 0x0000000f - O_INTOP(0x0000000f)   // 15 (15)
0x000001DC: 0xC001 0x00000003 - O_INTOP(0x00000003)   // 3 (3)
0x000001E2: 0xC001 0x00000000 - O_INTOP(0x00000000)   // 0 (0)
0x000001E8: 0x8032            - O_FETCH
0x000001EA: 0x8028            - O_LOOKUP_STRING_PROC
0x000001EC: 0x801B            - O_DUP
0x000001EE: 0xC001 0x00000003 - O_INTOP(0x00000003)   // 3 (3)
0x000001F4: 0x8027            - O_CHECK_ARG_COUNT
0x000001F6: 0x8005            - O_CALL
0x000001F8: 0xC001 0x00000001 - O_INTOP(0x00000001)   // 1 (1)
0x000001FE: 0x8031            - O_STORE

0x00000200: 0xC001 0x00000000 - O_INTOP(0x00000000)   // 0 (0)
0x00000206: 0x800D            - O_D_TO_A
0x00000208: 0x8019            - O_SWAPA
0x0000020A: 0x802A            - O_POP_TO_BASE
0x0000020C: 0x8029            - O_POP_BASE
0x0000020E: 0x800C            - O_A_TO_D
0x00000210: 0x801C            - O_POP_RETURN

0x00000212: 0x802A            - O_POP_TO_BASE
0x00000214: 0x8029            - O_POP_BASE
0x00000216: 0x801C            - O_POP_RETURN



Отправлено: 8:00 - 13 Апр., 2005
Alan Killenger
Пользователь

Откуда: Россия, Ижевск
Регистрация: Июль 2004

Всего: 404 сообщения

Что-то скриптоманьяков не слышно. А по-моему, круто. Можно вызывать процедуры из *.msg файла? Шучу, нельзя конечно .

(Отредактировал(а) Alan Killenger - 22:10 - 13 Апр., 2005)

Отправлено: 21:09 - 13 Апр., 2005
Anchorite
Пользователь

Откуда: Не здесь
Регистрация: Янв. 2003

Всего: 283 сообщения

А че нельзя-то???
Извлек название и вызывай

Отправлено: 21:51 - 14 Апр., 2005
 

Переход по темам
<< Пред. След. >>
Единственная страница этой темы


Powered by Ikonboard 2.1.9 RUS
Modified by RU.Board Team
© 2000 Ikonboard.com