Subversion Repositories Kolibri OS

Rev

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