Subversion Repositories Kolibri OS

Rev

Rev 6574 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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