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 |