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. public start as '_start'
  5. ;extrn mf_init
  6. extrn main
  7. include '../../../../programs/proc32.inc'
  8. ;include 'debug2.inc'
  9. __DEBUG__=0
  10.  
  11. ;start_:
  12. virtual at 0
  13.         db 'MENUET01' ; 1. Magic number (8 bytes)
  14.         dd 0x01       ; 2. Version of executable file
  15.         dd start       ; 3. Start address
  16.         dd 0x0        ; 4. Size of image
  17.         dd 0x100000   ; 5. Size of needed memory
  18.         dd 0x100000   ; 6. Pointer to stack
  19. hparams dd 0x0        ; 7. Pointer to program arguments
  20. hpath   dd 0x0        ; 8. Pointer to program path
  21. end virtual
  22.  
  23. start:
  24. ;DEBUGF 'Start programm\n'
  25.     ;init heap of memory
  26.     mov eax,68
  27.     mov ebx,11
  28.     int 0x40
  29.  
  30. ;DEBUGF ' path "%s"\n params "%s"\n', .path, .params
  31. ; check for overflow
  32. ;; that not work
  33. ;    mov  al, [path+buf_len-1]
  34. ;    or  al, [params+buf_len-1]
  35. ;    jnz   .crash
  36. ; check if path written by OS
  37.         mov  [argc], 0
  38.     mov  eax, [hparams]
  39.     test eax, eax
  40.     jz   .without_path
  41.     mov  eax, path
  42.     cmp  word ptr eax, 32fh  ; '/#3'  UTF8
  43.     jne  .without_path
  44.     mov  word ptr eax, 12fh  ; '/#1'  fix to CP866
  45. .without_path:
  46.     mov  esi, eax
  47.     call push_param
  48. ; retrieving parameters
  49.     mov  esi, params
  50.     xor  edx, edx  ; dl - èä¸ò ïàðàìåòð(1) èëè ðàçäåëèòåëè(0)
  51.                    ; dh - ñèìâîë ñ êîòîðîãî íà÷àëñÿ ïàðàìåòð (1 êàâû÷êè, 0 îñòàëüíîå)
  52.     mov  ecx, 1    ; cl = 1
  53.                    ; ch = 0  ïðîñòî íîëü
  54. .parse:
  55.     lodsb
  56.     test al, al
  57.     jz   .run
  58.     test dl, dl
  59.     jnz  .findendparam
  60.                      ;{åñëè áûë ðàçäåëèòåëü
  61.     cmp  al, ' '
  62.     jz   .parse  ;çàãðóæåí ïðîáåë, ãðóçèì ñëåäóþùèé ñèìâîë
  63.     mov  dl, cl  ;íà÷èíàåòñÿ ïàðàìåòð
  64.     cmp  al, '"'
  65.     jz   @f      ;çàãðóæåíû êàâû÷êè
  66.     mov  dh, ch     ;ïàðàìåòð áåç êàâû÷åê
  67.     dec  esi
  68.     call push_param
  69.     inc  esi
  70.     jmp  .parse
  71.  
  72.   @@:  
  73.     mov  dh, cl     ;ïàðàìåòð â êàâû÷åêàõ
  74.     call push_param ;åñëè íå ïðîáåë çíà÷èò íà÷èíàåòñÿ êàêîé òî ïàðàìåòð
  75.     jmp  .parse     ;åñëè áûë ðàçäåëèòåëü}
  76.  
  77. .findendparam:
  78.     test dh, dh
  79.     jz   @f ; áåç êàâû÷åê
  80.     cmp  al, '"'
  81.     jz   .clear
  82.     jmp  .parse
  83.   @@:  
  84.     cmp  al, ' '
  85.     jnz  .parse
  86.  
  87. .clear:
  88.     lea  ebx, [esi - 1]
  89.     mov  [ebx], ch
  90.     mov  dl, ch
  91.     jmp  .parse
  92.  
  93. .run:
  94. ;DEBUGF 'call main(%x, %x) with params:\n', [argc], argv
  95. if __DEBUG__ = 1
  96.     mov  ecx, [argc]
  97.   @@:
  98.     lea  esi, [ecx * 4 + argv-4]
  99.     DEBUGF '0x%x) "%s"\n', cx, [esi]
  100.     loop @b
  101. end if
  102.     push argv
  103.     push [argc]
  104.     call main
  105. .exit:
  106. ;DEBUGF 'Exit from prog\n';
  107.     xor  eax,eax
  108.     dec  eax
  109.     int  0x40
  110.     dd   -1
  111. .crash:
  112. ;DEBUGF 'E:buffer overflowed\n'
  113.     jmp  .exit
  114. ;============================
  115. push_param:
  116. ;============================
  117. ;parameters
  118. ;  esi - pointer
  119. ;description
  120. ;  procedure increase argc
  121. ;  and add pointer to array argv
  122. ;  procedure changes ebx
  123.     mov  ebx, [argc]
  124.     cmp  ebx, max_parameters
  125.     jae  .dont_add
  126.     mov  [argv+4*ebx], esi
  127.     inc  [argc]
  128. .dont_add:    
  129.     ret
  130.    
  131. proc memcpy c, to:dword,from:dword,count:dword
  132.     push esi
  133.     push edi
  134.     mov ecx,[count]
  135.         test ecx,ecx
  136.         jz no_copy_block
  137.         mov esi,[from]
  138.                 mov edi,[to]
  139.                 cld
  140.                 rep movsb
  141. no_copy_block:
  142.  
  143.     pop edi
  144.     pop esi
  145.     mov eax, [to]
  146.         ret
  147. endp
  148.  
  149. proc memmove c, to:dword,from:dword,count:dword
  150.  
  151.     push esi
  152.     push edi
  153.         mov ecx,[count]
  154.         test ecx,ecx
  155.         jz no_copy_block_
  156.                 mov esi,[from]
  157.                 mov edi,[to]
  158.                 cmp esi, edi
  159.                 je no_copy_block_
  160.                 jg copy_
  161.             add esi, ecx
  162.             add edi, ecx
  163.             dec esi
  164.             dec edi
  165.             std
  166. copy_:
  167.                 rep movsb
  168.         cld
  169. no_copy_block_:
  170.  
  171.     pop edi
  172.     pop esi
  173.     mov eax,[to]
  174.         ret
  175. endp
  176.  
  177. ;==============================
  178. public argc as '__argc'
  179. public params as '__argv'
  180. public path as '__path'
  181. public memcpy
  182. public memmove
  183.  
  184. section '.bss'
  185. buf_len = 0x400
  186. max_parameters=0x20
  187. argc     rd 1
  188. argv     rd max_parameters
  189. path     rb buf_len
  190. params   rb buf_len
  191.  
  192. ;section '.data'
  193. ;include_debug_strings ; ALWAYS present in data section
  194.