Subversion Repositories Kolibri OS

Rev

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