Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. format ELF
  2. section '.text' executable
  3. public start
  4. extrn mf_init
  5. extrn main
  6. ;include 'debug2.inc'
  7. __DEBUG__=0
  8. virtual at 0
  9.         db 'MENUET01' ; 1. Magic number (8 bytes)
  10.         dd 0x01       ; 2. Version of executable file
  11.         dd 0x0        ; 3. Start address
  12.         dd 0x0        ; 4. Size of image
  13.         dd 0x100000   ; 5. Size of needed memory
  14.         dd 0x100000   ; 6. Pointer to stack
  15. hparams dd 0x0        ; 7. Pointer to program arguments
  16. hpath   dd 0x0        ; 8. Pointer to program path
  17. end virtual
  18. start:
  19. ;DEBUGF 'Start programm\n'
  20.     xor  eax,eax
  21.     call mf_init
  22. ;DEBUGF ' path "%s"\n params "%s"\n', .path, .params
  23. ; check for overflow
  24.     mov  al, [path+buf_len-1]
  25.     or   al, [params+buf_len-1]
  26.     jnz   .crash
  27. ; check if path written by OS
  28.     mov  eax, [hparams]
  29.     test eax, eax
  30.     jz   .without_path
  31.     mov  eax, path
  32. .without_path:
  33.     mov  esi, eax
  34.     call push_param
  35. ; retrieving parameters
  36.     mov  esi, params
  37.     xor  edx, edx  ; dl - èä¸ò ïàðàìåòð(1) èëè ðàçäåëèòåëè(0)
  38.                    ; dh - ñèìâîë ñ êîòîðîãî íà÷àëñÿ ïàðàìåòð (1 êàâû÷êè, 0 îñòàëüíîå)
  39.     mov  ecx, 1    ; cl = 1
  40.                    ; ch = 0  ïðîñòî íîëü
  41. .parse:
  42.     lodsb
  43.     test al, al
  44.     jz   .run
  45.     test dl, dl
  46.     jnz  .findendparam
  47.                      ;{åñëè áûë ðàçäåëèòåëü
  48.     cmp  al, ' '
  49.     jz   .parse  ;çàãðóæåí ïðîáåë, ãðóçèì ñëåäóþùèé ñèìâîë
  50.     mov  dl, cl  ;íà÷èíàåòñÿ ïàðàìåòð
  51.     cmp  al, '"'
  52.     jz   @f      ;çàãðóæåíû êàâû÷êè
  53.     mov  dh, ch     ;ïàðàìåòð áåç êàâû÷åê
  54.     dec  esi
  55.     call push_param
  56.     inc  esi
  57.     jmp  .parse
  58.  
  59.   @@:  
  60.     mov  dh, cl     ;ïàðàìåòð â êàâû÷åêàõ
  61.     call push_param ;åñëè íå ïðîáåë çíà÷èò íà÷èíàåòñÿ êàêîé òî ïàðàìåòð
  62.     jmp  .parse     ;åñëè áûë ðàçäåëèòåëü}
  63.  
  64. .findendparam:
  65.     test dh, dh
  66.     jz   @f ; áåç êàâû÷åê
  67.     cmp  al, '"'
  68.     jz   .clear
  69.     jmp  .parse
  70.   @@:  
  71.     cmp  al, ' '
  72.     jnz  .parse
  73.  
  74. .clear:
  75.     lea  ebx, [esi - 1]
  76.     mov  [ebx], ch
  77.     mov  dl, ch
  78.     jmp  .parse
  79.  
  80. .run:
  81. ;DEBUGF 'call main(%x, %x) with params:\n', [argc], argv
  82. if __DEBUG__ = 1
  83.     mov  ecx, [argc]
  84.   @@:
  85.     lea  esi, [ecx * 4 + argv-4]
  86.     DEBUGF '0x%x) "%s"\n', cx, [esi]
  87.     loop @b
  88. end if
  89.     push [argc]
  90.     push argv
  91.     call main
  92. .exit:
  93. ;DEBUGF 'Exit from prog\n';
  94.     xor  eax,eax
  95.     dec  eax
  96.     int  0x40
  97.     dd   -1
  98. .crash:
  99. ;DEBUGF 'E:buffer overflowed\n'
  100.     jmp  .exit
  101. ;============================
  102. push_param:
  103. ;============================
  104. ;parameters
  105. ;  esi - pointer
  106. ;description
  107. ;  procedure increase argc
  108. ;  and add pointer to array argv
  109. ;  procedure changes ebx
  110.     mov  ebx, [argc]
  111.     cmp  ebx, max_parameters
  112.     jae  .dont_add
  113.     mov  [argv+4*ebx], esi
  114.     inc  [argc]
  115. .dont_add:    
  116.     ret
  117. ;==============================
  118. public params as '__argv'
  119. public path as '__path'
  120.  
  121. section '.bss'
  122. buf_len = 0x400
  123. max_parameters=0x20
  124. argc     rd 1
  125. argv     rd max_parameters
  126. path     rb buf_len
  127. params   rb buf_len
  128.  
  129. ;section '.data'
  130. ;include_debug_strings ; ALWAYS present in data section