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 ▀ 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
гостевая; E-mail |