Subversion Repositories Kolibri OS

Rev

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