Subversion Repositories Kolibri OS

Rev

Rev 145 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
145 halyavin 1
format ELF
2
section '.text' executable
3
public start
4
extrn mf_init
5
extrn main
215 victor 6
 
7
__DEBUG__ equ 1
8
__DEBUG_LEVEL__ equ 1
9
 
10
include 'DEBUG-FDO.INC'
11
 
145 halyavin 12
virtual at 0
215 victor 13
	db 'MENUET01' ; 1. Magic number (8 bytes)
14
	dd 0x01       ; 2. Version of executable file
15
	dd 0x0	      ; 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
145 halyavin 21
end virtual
22
start:
215 victor 23
DEBUGF 1,'Start programm\n'
145 halyavin 24
    xor  eax,eax
25
    call mf_init
215 victor 26
DEBUGF 1,' path "%s"\n params "%s"\n', path, params
145 halyavin 27
; check for overflow
28
    mov  al, [path+buf_len-1]
215 victor 29
    or	 al, [params+buf_len-1]
145 halyavin 30
    jnz   .crash
31
; check if path written by OS
32
    mov  eax, [hparams]
33
    test eax, eax
215 victor 34
    jz	 .without_path
145 halyavin 35
    mov  eax, path
36
.without_path:
37
    mov  esi, eax
38
    call push_param
39
; retrieving parameters
40
    mov  esi, params
41
    xor  edx, edx  ; dl - идёт параметр(1) или разделители(0)
215 victor 42
		   ; dh - символ с которого начался параметр (1 кавычки, 0 остальное)
145 halyavin 43
    mov  ecx, 1    ; cl = 1
215 victor 44
		   ; ch = 0  просто ноль
145 halyavin 45
.parse:
46
    lodsb
47
    test al, al
215 victor 48
    jz	 .run
145 halyavin 49
    test dl, dl
50
    jnz  .findendparam
215 victor 51
		     ;{если был разделитель
145 halyavin 52
    cmp  al, ' '
215 victor 53
    jz	 .parse  ;загружен пробел, грузим следующий символ
145 halyavin 54
    mov  dl, cl  ;начинается параметр
55
    cmp  al, '"'
215 victor 56
    jz	 @f	 ;загружены кавычки
145 halyavin 57
    mov  dh, ch     ;параметр без кавычек
58
    dec  esi
59
    call push_param
60
    inc  esi
61
    jmp  .parse
62
 
63
  @@:
64
    mov  dh, cl     ;параметр в кавычеках
65
    call push_param ;если не пробел значит начинается какой то параметр
66
    jmp  .parse     ;если был разделитель}
67
 
68
.findendparam:
69
    test dh, dh
215 victor 70
    jz	 @f ; без кавычек
145 halyavin 71
    cmp  al, '"'
215 victor 72
    jz	 .clear
145 halyavin 73
    jmp  .parse
74
  @@:
75
    cmp  al, ' '
76
    jnz  .parse
77
 
78
.clear:
79
    lea  ebx, [esi - 1]
80
    mov  [ebx], ch
81
    mov  dl, ch
82
    jmp  .parse
83
 
84
.run:
215 victor 85
DEBUGF 1,'call main(%x, %x) with params:\n', [argc], argv
145 halyavin 86
if __DEBUG__ = 1
87
    mov  ecx, [argc]
88
  @@:
89
    lea  esi, [ecx * 4 + argv-4]
215 victor 90
    DEBUGF 1,'%d) "%s"\n', cx, [esi]
145 halyavin 91
    loop @b
92
end if
215 victor 93
    push argv
145 halyavin 94
    push [argc]
95
    call main
96
.exit:
215 victor 97
DEBUGF 1,'Exit from prog with code: %x\n', eax;
145 halyavin 98
    xor  eax,eax
99
    dec  eax
100
    int  0x40
215 victor 101
    dd	 -1
145 halyavin 102
.crash:
215 victor 103
DEBUGF 1,'E:buffer overflowed\n'
145 halyavin 104
    jmp  .exit
105
;============================
106
push_param:
107
;============================
108
;parameters
109
;  esi - pointer
110
;description
111
;  procedure increase argc
112
;  and add pointer to array argv
113
;  procedure changes ebx
114
    mov  ebx, [argc]
115
    cmp  ebx, max_parameters
116
    jae  .dont_add
117
    mov  [argv+4*ebx], esi
118
    inc  [argc]
119
.dont_add:
120
    ret
121
;==============================
122
public params as '__argv'
123
public path as '__path'
124
 
125
section '.bss'
126
buf_len = 0x400
127
max_parameters=0x20
215 victor 128
argc	 rd 1
129
argv	 rd max_parameters
130
path	 rb buf_len
131
params	 rb buf_len
145 halyavin 132
 
215 victor 133
section '.data'
134
include_debug_strings ; ALWAYS present in data section