Subversion Repositories Kolibri OS

Rev

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