|
Pers.narod.ru. Программы. 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 ▀
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
|
|