Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
8687 turbocat 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