Nickolay.info. Программы. Assembler. Выгружалка для Norton Commander

Выгружалка для Norton Commander, кажется, написана во времена 4-й версии. Запускалась командной строкой вида

nc_exit <строка до 12 символов>

и выгружала Norton Commander, а затем запускала программу, имя которой передано через строку, скажем

nc_exit win.com

PAGE  59,132
  
data_1e		equ	1Ah			; 
data_2e		equ	1Ch			; 
data_3e		equ	1Eh			; 
  
seg_a		segment	byte public
		assume	cs:seg_a, ds:seg_a
		org	100h
  
nc_exit		proc	far
start:
		jmp	loc_14			; 
data_4		db	'Выгружалка для Norton`а'
data_8		db	0Dh, 0Ah,'Использование: nc_exit <строка до 12 символов>',0Dh, 0Ah
		db      'Перед выполнением NC_EXIT выгрузит Norton Commander и', 0Dh, 0Ah
		db	'запустит программу,имя которой передано через строку', 0Dh, 0Ah 
		db	'Пример: nc_exit win.com', 0Dh, 0Ah
data_13		db	0Dh, 0Ah,07h,'Строка слишком длинная!'
data_15		db	1
data_16		dw	80h
  
nc_exit		endp

sub_1		proc	near
		mov	bx,1
		mov	ah,40h			; '@'
		int	21h			; DOS Services  ah=function 40h
		retn
sub_1		endp				;  terminate with al=return code
  
  ; Разбирает строку параметров  
sub_2		proc	near
		push	di
		push	si
		push	ax
loc_1:                ; Параметр /? есть
		inc	data_16			; 128 - psp size
		mov	di,data_16		; 
		mov	al,[di]
		cmp	al,20h			; ' '
		je	loc_1			; Jump if equal
		cmp	al,3Fh			; '?'
		je	loc_4			; Jump if equal
		cmp	al,0Dh
		je	loc_3			; Jump if equal
		cmp	al,0
		je	loc_3			; Jump if equal
		cmp	al,2Fh			; '/'
		je	loc_2			; Jump if equal
		jmp	short loc_5		; (036C)
loc_2:
		inc	data_16			; (7CF7:02E8=80h)
		mov	di,data_16		; (7CF7:02E8=80h)
		mov	al,[di]
		cmp	al,3Fh			; '?'
		je	loc_4			; Jump if equal
		and	al,0DFh            ; 223 &#9600;
loc_3:
		mov	dl,2
		mov	bl,2
		jmp	short loc_6		; (0388)
loc_4:          ; if parameter /?
                mov     cx,183
		mov	dx,offset data_8	; Message about
		call	sub_1			; program actions		
		jmp	short loc_6		; go to end
loc_5:
		xor	dx,dx			; Zero register
		mov	dl,al
		call	sub_4			; (038C)
		cmp	dl,2
		je	loc_6			; Jump if equal
		inc	data_16			; (7CF7:02E8=80h)
		mov	di,data_16		; (7CF7:02E8=80h)
		mov	al,[di]
		cmp	al,0Dh
		je	loc_3			; Jump if equal
		jmp	short loc_5		; (036C)
loc_6:
		pop	ax
		pop	si
		pop	di
		retn
sub_2		endp
  
  
  ; Осуществляет выход из NC
sub_4		proc	near
		push	sp
		push	cx
		push	bx
		push	ax
		push	ds
		mov	ax,40h
		push	ax
		pop	ds
		mov	bx,data_1e		; ESC
		mov	cx,[bx]
		mov	bx,data_2e		;  28
		mov	ax,[bx]
		mov	bl,al
		cmp	cl,bl
		je	loc_9			; Jump if equal
		inc	bx
		inc	bx
		cmp	bx,3Ch
		jg	loc_7			; Jump if >
		jmp	short loc_8		; (03B3)
loc_7:
		mov	bx,data_3e		;  30
loc_8:
		cmp	cl,bl
		je	loc_12			; Jump if equal
loc_9:
		mov	bl,al
		mov	[bx],dx
		inc	bx
		inc	bx
		cmp	bx,3Ch
		jg	loc_10			; Jump if >
		jmp	short loc_11		; (03C8)
loc_10:
		mov	bx,1Eh             ; 30
loc_11:
		mov	ax,bx
		mov	bx,data_2e		; (0040:001C=20h)
		mov	[bx],ax
		mov	dx,1
		jmp	short loc_13		; (03DD)
loc_12:
		pop	ds
		mov	dl,2
		mov	data_15,dl		; 1 or 2
		push	ds
loc_13:
		pop	ds
		pop	ax
		pop	bx
		pop	cx
		pop	sp
		retn
sub_4		endp
  
loc_14:        ; Точка входа в программу
		push	ax
		push	bx
		mov	cx,23
		mov	dx,offset data_4
		call	sub_1			;  Mark of the program
		
		; Call nc exit		
;  		mov	dx,11Bh                 ; 283
;		call	sub_4			; 
                mov     dx,4400h		; 'D' 68 ; если удалить только
		call	sub_4			; эти 2 строки - зацикливание
                                                ; на выходе и входе в nc
 		mov	dx,1C0Dh                ; 28,10
 		; Лишний перевод строки - для выполнения в командном режиме
		call	sub_4			; 
		
		call	sub_2			; Parameters for process
		
		mov	dl,data_15		; 1 or 2
		cmp	dl,2
		je	loc_16			; Jump if equal
		mov	dx,1C0Dh                ; 28,10 без этих строк ; 
		call	sub_4			; команда копируется в
                        		        ; ком.строку,но не выполняется                     
                ; OD - "Да" для Нортона
		mov	dl,data_15		; 1 or 2
		cmp	dl,2
		jne	loc_17			; Jump if not equal
loc_16:
		mov	cx,26
		mov	dx,offset data_13	; Сообщение о 
		call	sub_1			; длинной строке
loc_17:
		pop	bx
		pop	ax
		mov	al,dl
		mov	ah,4Ch			; 'L' EXIT
		int	21h			; DOS Services  ah=function 4Ch
db 'NK'
seg_a		ends

		end	start

Рейтинг@Mail.ru
вверх гостевая; E-mail