![]() |
|
Сны воина дzена...
.code
entry: mov ax,@data mov ds,ax ;------------------------------------------------------- ; ; GF(2^8) Exp3 and Log3 Table generator (AES) ; ; p(x) = x^8 + x^4 + x^3 + x + 1 (p = 0x11B) ; alpha(x) = x + 1 (alpha = 0x3) ; ; alpha(x)^0 = 1; alpha(x)^255 = 1; k = 1..254 ; alpha(x)^k = ((alpha(x)^(k - 1)) * alpha(x)) mod p(x) ; ; log(0) = 0 (N/A); log(1) = 0; ; log(alpha(x)^k) = k ; ;------------------------------------------------------- mov byte ptr ET3[0],1 mov byte ptr ET3[255],1 mov byte ptr LT3[0],0 mov byte ptr LT3[1],0 xor bx,bx mov si,1 l0: mov bl,ET3[si-1] shl bl,1 jnc l1 xor bl,byte ptr AES_P l1: xor bl,ET3[si-1] mov ET3[si],bl mov ax,si mov LT3[bx],al inc si cmp si,255 jne l0 ;---------------------------------------------- ; ; GF(2^8) Mul Inverse Table generator (AES) ; ; (0)^(-1) = 0 (N/A); (1)^(-1) = 1; k = 2..255 ; ; k(x)^(-1) = alpha(x)^(255 - log(k(x))) ; ; (k(x)*(k(x)^(-1))) mod p(x) = 1 ; ;---------------------------------------------- mov byte ptr INVT[0],0 mov byte ptr INVT[1],1 xor bx,bx mov si,2 l2: mov bl,LT3[si] not bl mov al,ET3[bx] mov INVT[si],al inc si cmp si,256 jne l2 ;---------------------------------------------- ; ; AES S-Box Table generator ; ; g(x) = x^4 + x^3 + x^2 + x + 1 ; c(x) = x^6 + x^5 + x + 1 ; k = 0..255 ; ; t(x) = k(x)^(-1) in GF(2^8) field for AES ; (0)^(-1) is assumed to be 0 ; ; sb(x) = ((t(x) * g(x)) mod (x^8 + 1)) + c(x) ; operations with polynoms over GF(2) ; ;---------------------------------------------- xor bx,bx xor si,si l3: mov al,INVT[si] mov bl,al mov cx,4 l4: rol al,1 xor bl,al loop l4 xor bl,AES_C mov SBT[si],bl inc si cmp si,256 jne l3 ;---------------------------------------------- ; ; AES Inverse S-Box Table generator ; ; h(x) = x^6 + x^3 + x ; c(x) = x^6 + x^5 + x + 1 ; k = 0..255 ; ; t(x) = (((k(x) + c(x)) * h(x)) mod (x^8 + 1) ; operations with polynoms over GF(2) ; ; isb(x) = t(x)^(-1) in GF(2^8) field for AES ; (0)^(-1) is assumed to be 0 ; ;---------------------------------------------- xor bx,bx xor si,si l5: mov ax,si xor al,AES_C xor bl,bl mov cx,3 l6: rol al,3 xor bl,al loop l6 mov al,INVT[bx] mov ISBT[si],al inc si cmp si,256 jne l5 fin: mov ax,4c00h int 21h .data ET3 db 256 dup (0) LT3 db 256 dup (0) INVT db 256 dup (0) SBT db 256 dup (0) ISBT db 256 dup (0) AES_P dw 011Bh AES_C db 63h end entry |
Ассемблер, что ли?
|
Он самый, родимый ;)
|
И часто снится? ;)
|
Поскольку тема про секс-символы закрыта придется мериться программами на ассемблере.
Вот исходник программы, написанной мной году в 1999-ом (и за нее я получил небольшие деньги). Резидентный драйвер под DOS для перекодировки интерфейсов (ИРПР в ИРПР-М). Предназначен был для подключения к PC принтера CM6315 Скрытый текст
TITLE CM6315 P286 Text SEGMENT PARA ASSUME CS: Text ORG 100h ;------------- начало резидентной части программы ------------------- ; Old_2Fh_Vector dd 0 Old_2Fh_Vector: Entry: jmp near ptr Begin ; эта команда занимает три байта fourthbyte db 0 Old_17h_Vector dd 0 OUR_2Fh_MUX_ID EQU 0C7h Koi7Rus db 97, 98, 119, 103, 100, 101, 118, 122, 105, 106, 107, 108, 109, 110, 111 db 112, 114, 115, 116, 117, 102, 104, 99, 126, 123, 125, 120, 121, 120, 124 db 96, 113, 97, 98, 119, 103, 100, 101, 118, 122, 105, 106, 107, 108, 109 db 110, 111, 112, 32, 32, 32, 255, 255, 255, 255, 43, 43, 255, 255, 43, 43 db 43, 43, 43, 43, 45, 45, 255, 45, 43, 255, 255, 43, 43, 45, 45, 255, 45 db 43, 45, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 32, 32, 255, 255, 32 db 114, 115, 116, 117, 102, 104, 99, 126, 123, 125, 120, 121, 120, 124, 96 db 113, 101, 101 lptStrobe EQU 01h lptNoAutoLF EQU 02h lptInit EQU 04h lptSelect EQU 08h lptIRQEnb EQU 10h WRITE_LPT_CONTROL_PORT MACRO Value ; запись в порт управления LPT1 pusha mov DX, 37Ah mov AL, Value out DX, AL popa ENDM WaitWhileAcknowledgeZero PROC NEAR push AX mov DX, 379h iszero: in AL, DX test AL, 40h jz iszero pop AX retn WaitWhileAcknowledgeZero ENDP WaitWhileAcknowledgeNotZero PROC NEAR push AX mov DX, 379h notzero: in AL, DX test AL, 40h jnz notzero pop AX retn WaitWhileAcknowledgeNotZero ENDP ; если в AL - символ Ch1, заменить его на Ch2 и пеpеход на RecodedLabel REPLACE_CHAR MACRO Ch1, Ch2, RecodedLabel LOCAL noexchange; cmp AL, Ch1 jne noexchange mov AL, Ch2 jmp near ptr RecodedLabel noexchange: ENDM ; процедура вывода символа на СМ6315 с ожиданием в конце строки PrintKOI7H2Char PROC NEAR ; в AL - код символа cmp AL, 32 jae printable_char cmp AL, 10 je recoded cmp AL, 13 je recoded jmp near ptr endprint printable_char: REPLACE_CHAR '|', 255, recoded REPLACE_CHAR '~', '^', recoded REPLACE_CHAR '`', 39, recoded REPLACE_CHAR '}', ']', recoded REPLACE_CHAR '{', '[', recoded cmp AL, 'a' jb recoded cmp AL, 'z' ja rus sub AL, 32 jmp short recoded rus: REPLACE_CHAR 'Ё', 'Е', dorec REPLACE_CHAR 'ё', 'е', dorec cmp AL, 241 ja endprint cmp AL, 128 jae dorec dorec: sub AL, 128 xor AH, AH mov BX, OFFSET Koi7Rus add BX, AX mov AL, BYTE PTR CS:[BX] recoded: ; инвертируем код символа not AL ; ждем сигнала готовности получить символ call WaitWhileAcknowledgeNotZero ; вывод символа в LPT - порт mov DX, 378h out DX, AL ; выставляем сигнал подтверждения передачи символа WRITE_LPT_CONTROL_PORT lptSelect+lptStrobe ; ждем сигнала "неготовности" получить другой символ call WaitWhileAcknowledgeZero ; сбрасываем сигнал подтверждения передачи символа WRITE_LPT_CONTROL_PORT lptSelect ; ждем сигнала готовности получить символ call WaitWhileAcknowledgeNotZero endprint: retn PrintKOI7H2Char ENDP ; функция (прерывания BIOS) печати на принтере символа New_17h PROC FAR push DX push AX WRITE_LPT_CONTROL_PORT lptSelect cmp AH, 00h jne retstatus call PrintKOI7H2Char ; в AL - код символа retstatus: ; получим статус порта принтера mov DX, 379h in AL, DX ; сформируем значение PrinterStatusRec mov AH, AL and AH, 10111000b xor AH, 08h mov DH, AH pop AX mov AH, DH pop DX iret New_17h ENDP ; Entry: AH = OUR_2Fh_MUX_ID; AL = 0; DX = 0FFFFh; ; Exit (if Ok): AL = 0FFh; DX = CS New_2Fh PROC FAR cmp AH, OUR_2Fh_MUX_ID jne old2Fh cmp AL, 0 jne old2Fh cmp DX, 0FFFFh jne old2Fh mov AL, 0FFh mov DX, CS jmp short end2Fh old2Fh: jmp DWORD PTR Old_2Fh_Vector end2Fh: iret New_2Fh ENDP ResidentSectionEndLabel LABEL WORD ;------------- конец резидентной части программы -------------------- ;------------- нерезидентная часть программы ------------------------ SET_VECTOR MACRO IntNumber, NewHandle, OldVector mov AL, IntNumber mov AH, 35h int 21h mov Word Ptr OldVector, BX mov Word Ptr OldVector+2, ES mov AH, 25h mov DX, OFFSET NewHandle int 21h ENDM RESTORE_VECTOR MACRO IntNumber, OldVector mov AL, IntNumber mov AH, 25h mov DX, Word Ptr OldVector mov DS, Word Ptr OldVector+2 int 21h ENDM AboutStr db 33, 44, 43, 1, 1, 66, 76, 23, 18, 16, 20, 1, 87, 15, 16, 15, 16, 44, 43, 33 WhatIsStr db 99, 67, 67, 236, 131, 205, 192, 131, 195, 207, 207, 195, 67, 204, 198, 131, 198, 201, 205, 199, 203, 131, 205, 193, 201 db 203, 67, 130, 203, 207, 193, 205, 200, 205, 193, 67, 199, 200, 140, 67, 227, 245, 236, 240, 67, 242, 239, 85, 80, 82, 86, 110, 105, 99 AuthorStr db 33, 1, 1, 9, 66, 8, 1, 161, 140, 133, 193, 132, 136, 1, 184, 137, 193, 202, 136, 1, 19, 17, 17, 17, 12, 19, 17, 17, 16, 44, 43, 33 UsageStr db 51, 62, 57, 19, 19, 180, 147, 144, 211, 208, 148, 153, 147, 9, 19, 19, 19, 80, 94, 5, 0, 2, 6, 29, 80, 92, 94, 62, 57, 19, 19, 177, 216 db 144, 211, 208, 148, 153, 147, 9, 19, 19, 19, 80, 94, 5, 0, 2, 6, 29, 80, 92, 94, 19, 28, 70, 62, 57, 51 LoadedStr db 11, 6, 1, 43, 43, 132, 174, 235, 174, 161, 165, 175, 163, 235, 165, 169, 226, 163, 161, 43, 232, 173, 174, 43, 172, 171, 168, 235, 232, 173, 174, 166, 6, 1, 6, 1, 11 MemErrStr db 79, 66, 69, 111, 111, 193, 167, 231, 238, 229, 239, 111, 225, 174, 237, 225, 238, 225, 233, 235, 234, 226, 231, 160, 111, 224, 239, 227, 160, 173, 231, 66, 69, 79 UnloadStr db 34, 47, 40, 2, 2, 173, 135, 194, 135, 136, 140, 134, 138, 194, 140, 128, 203, 138, 136, 2, 128, 201, 129, 194, 193, 132, 135, 143, 47, 40, 34 BadPrmStr db 99, 110, 105, 67, 67, 238, 198, 193, 198, 131, 206, 136, 202, 67, 204, 195, 131, 195, 207, 198, 129, 131, 110, 105, 99 UnloadMe db 0 ; процедура расшифровки и вывода на экран строки WriteString PROC NEAR mov AH, 02h mov DH, [SI] nextchar: inc SI mov DL, [SI] xor DL, DH jz nullchar int 21h jmp short nextchar nullchar: retn WriteString ENDP WRITE MACRO String mov SI, OFFSET String call WriteString ENDM Begin: ; найти параметр [/u|/U|-u|-U] в командной строке mov CL, BYTE PTR ES:[80h] or CL, CL jz NoParam mov AL, 32 mov DI, 81h xor CH, CH cld repe scasb ; пропускаем пробелы mov AX, WORD PTR ES:[DI-1] cmp AL, 2Dh je Check2 cmp AL, 2Fh jne BadParam Check2: cmp AH, 55h je IsUnloadParam cmp AH, 75h je IsUnloadParam BadParam: WRITE BadPrmStr jmp near ptr Exit IsUnloadParam: mov UnloadMe, 1 jmp short LoadIFNess NoParam: mov UnloadMe, 0 LoadIFNess: mov AH, 4Ah mov BX, 00 int 21h jc MemFreeErr ; освободить блок окружения mov AX, WORD PTR ES:[2ch] mov ES, AX mov AH, 49h int 21h jc MemFreeErr mov AX, CS mov DS, AX WRITE_LPT_CONTROL_PORT lptSelect mov AH, OUR_2Fh_MUX_ID mov AL, 0 mov DX, 0FFFFh int 2Fh cmp AL, 0 ; если не загружен je Load cmp UnloadMe, 1 je UnLoad jmp near ptr Loaded Load: WRITE AboutStr WRITE WhatIsStr WRITE AuthorStr WRITE UsageStr SET_VECTOR 17h, New_17h, Old_17h_Vector SET_VECTOR 2Fh, New_2Fh, Old_2Fh_Vector ; завершиться но остаться резидентным mov DX, OFFSET ResidentSectionEndLabel ; Установка окончания резидентной части int 27h MemFreeErr: WRITE MemErrStr jmp near ptr Exit Loaded: WRITE LoadedStr jmp near ptr Exit Unload: ; в DX мультиплексное прерывание возвращает CS резидента mov ES, DX RESTORE_VECTOR 17h, ES:Old_17h_Vector RESTORE_VECTOR 2Fh, ES:Old_2Fh_Vector mov AH, 49h int 21h jc MemFreeErr mov AX, CS mov DS, AX WRITE UnloadStr jmp near ptr Exit Exit: mov AX, 4C00h int 21h Text ENDS END Entry |
Продолжаем безумство цитирования исходников ...
Фрагмент программы, переводящей процессор из реального режима в защищенный Скрытый текст
IDEAL P386 LOCALS BackKey EQU 10 EnterKey EQU 11 NoKey EQU 12 Common EQU offset Code_D Left EQU 5 Right EQU 44 STRUC Descr ; структура для описания дескриптора сегмента ;;;;;;;;;;;;;;;;;;; Lim dw 0; граница ( биты 0..15 ) Base_L dw 0; база, биты 0..15 Base_M db 0; база, биты 16..23 Attr_1 db 0; байт атрибутов 1 Attr_2 db 0; граница ( биты 16..19 ) и атрибуты 2 Base_H db 0; база, биты 24..31 ENDS STRUC Gate ; структура для описания дескриптора шлюза ;;;;;;;;;;;;;;;;;;;;;;; Offs_L dw 0; смещение ( биты 0..15 ) Sel dw 0; селектор задачи Count db 0; слово пересчета ( биты 0..4 ) Attr db 0; байт атрибутов Offs_H dw 0; смещение ( биты 16..31 ) ENDS MACRO Mov_Seg seg, addr ; загрузка сегментного регистра mov AX, addr ; через регистр AX mov seg, AX ; в регистр seg ENDM MACRO Make_Linear seg ; создание линейного адреса xor EAX, EAX ; старшее слово := 0 mov AX, seg ; в младшее - seg shl EAX, 4 ; сдвиг - и все Ok ENDM MACRO Put_To_GDT where, seg ; зарегистрировать в GDT make_linear seg ; получение линейного адреса mov [Where.Base_L], AX ; биты 0..15 rol EAX, 16 ; меняем слова EAX mov [Where.Base_M], AL ; биты 16..19 (дальше нули) ENDM MACRO Load_GDTR ; загрузка регистра GDTR make_linear GDT ; получение линейного адреса mov [DWORD GDT_PTR + 2], EAX ; база GDT, биты 0..31 mov [WORD GDT_PTR + 0], GDT_Size-1 ; граница GDT lgdt [GDT_PTR] ; загрузка таблицы ENDM MACRO Load_IDTR ; загрузка регистра IDTR make_linear IDT ; получение линейного адреса mov [DWORD IDT_PTR + 2], EAX ; база IDT, биты 0..31 mov [WORD IDT_PTR + 0], IDT_Size-1 ; граница IDT lidt [IDT_PTR] ; загрузка таблицы ENDM MACRO Jmp_Next seg ; очистка очереди команд db 0EAh ; jmp (seg):(next) dw $+4 ; адрес следующей команды dw seg ; сегмент или селектор ENDM MACRO Load_Selectors_Protected mov_seg SS, <offset Stk0_D> ; селектор сегмента стека mov_seg DS, <offset Dat0_D> ; селектор сегмента данных mov_seg ES, <offset Scr_D> ; селектор сегмента Scr mov_seg FS, <offset Dat0_D> ; селектор сегмента данных mov_seg GS, <offset GDT_D> ; селектор сегмента GDT ENDM MACRO Load_Selectors_Real mov_seg SS, Stk0 ; стек mov_seg DS, Dat0 ; данные mov_seg ES, Scr ; Scr mov_seg FS, Dat0 ; данные mov_seg GS, GDT ; GDT ENDM MACRO Sti_All sti ; разрешить маскируемые mov AL, 0h ; разрешить немаскируемое out 70h, AL ; ENDM MACRO Cli_All cli ; запретить маскируемые mov AL, 80h ; запретить немаскируемое out 70h, AL ; ENDM MACRO Set_Limits_Real mov [Code_D.Lim], 0FFFFh ; CS mov [Stk0_D.Lim], 0FFFFh ; SS mov [Dat0_D.Lim], 0FFFFh ; DS и FS mov [Scr_D.Lim ], 0FFFFh ; ES mov [GDT_D.Lim ], 0FFFFh ; GS ENDM ; объявляя TSSы вызываемых задач, инициализируем их SEGMENT TSS0 ; сегмент TSS главной задачи tss{ ESP0 = Stk0_Size, \ SS0 = offset Stk0_D, \ ESP1 = Stk0_Size, \ SS1 = offset Stk0_D, \ ESP2 = Stk0_Size, \ SS2 = offset Stk0_D } ENDS ; SEGMENT TSS1 ; сегмент TSS задачи 1 tss{ ESP0 = Stk1_Size, \ SS0 = offset Stk1_D, \ ESP1 = Stk1_Size, \ SS1 = offset Stk1_D, \ ESP2 = Stk1_Size, \ SS2 = offset Stk1_D, \ EIP = offset Game, \ ESP = Stk1_Size, \ SS = offset Stk1_D, \ CS = offset Code_D, \ DS = offset Dat0_D, \ ES = offset Scr_D, \ FS = offset Dat1_D, \ GS = offset Null_D } ENDS ; SEGMENT TSS2 ; сегмент TSS задачи 2 tss{ ESP0 = Stk2_Size, \ SS0 = offset Stk2_D, \ ESP1 = Stk2_Size, \ SS1 = offset Stk2_D, \ ESP2 = Stk2_Size, \ SS2 = offset Stk2_D, \ ESP = Stk2_Size, \ EIP = offset Game, \ SS = offset Stk2_D, \ CS = offset Code_D, \ DS = offset Dat0_D, \ ES = offset Scr_D, \ FS = offset Dat2_D, \ GS = offset Null_D } ENDS ; SEGMENT TSSD ; сегмент TSS драйвера tss{ ESP0 = StkD_Size, \ SS0 = offset StkD_D, \ ESP1 = StkD_Size, \ SS1 = offset StkD_D, \ ESP2 = StkD_Size, \ SS2 = offset StkD_D, \ EIP = offset Driver, \ SS = offset StkD_D, \ CS = offset Code_D, \ DS = offset Dat0_D, \ ES = offset Scr_D, \ FS = offset Dat0_D, \ GS = offset Null_D } ENDS ; SEGMENT GDT ; таблица глобальных дескрипторов GDT Null_D descr <0 ,0,0,00h,0,0> ; пустой сегмент Zero_D descr <0FFFFh ,0,0,92h,0,0> ; нулевой сегмент Code_D descr <Code_Size-1,0,0,9Ch,0,0> ; сегмент кодa программы Dat0_D descr <Dat0_Size-1,0,0,92h,0,0> ; сегмент даннных Dat1_D descr <Dat1_Size-1,0,0,92h,0,0> ; сегмент даннных 1 Dat2_D descr <Dat2_Size-1,0,0,92h,0,0> ; сегмент даннных 2 Stk0_D descr <Stk0_Size-1,0,0,92h,0,0> ; сегмент стека 0 Stk1_D descr <Stk1_Size-1,0,0,92h,0,0> ; сегмент стека 1 Stk2_D descr <Stk2_Size-1,0,0,92h,0,0> ; сегмент стека 2 StkD_D descr <StkD_Size-1,0,0,92h,0,0> ; сегмент стека драйвера Scr_D descr <Scr_Size -1,0,0,92h,0,0> ; видеобуфер GDT_D descr <GDT_Size -1,0,0,92h,0,0> ; GDT IDT_D descr <IDT_Size -1,0,0,92h,0,0> ; IDT TSS0_D descr <TSS_Size -1,0,0,89h,0,0> ; TSS главной задачи TSS1_D descr <TSS_Size -1,0,0,89h,0,0> ; TSS первой задачи TSS2_D descr <TSS_Size -1,0,0,89h,0,0> ; TSS второй задачи TSSD_D descr <TSS_Size -1,0,0,89h,0,0> ; TSS драйвера ENDS ; SEGMENT IDT ; таблица дескрипторов прерываний IDT gate <int0 ,common,0,8Eh,0> ; 0 - деление на ноль gate <int1 ,common,0,8Eh,0> ; 1 - отладка gate <int2 ,common,0,8Eh,0> ; 2 - INT 2 или NMI gate <int3 ,common,0,8Eh,0> ; 3 - точка останова gate <int4 ,common,0,8Eh,0> ; 4 - переполнение gate <int5 ,common,0,8Eh,0> ; 5 - контроль границ gate <int6 ,common,0,8Eh,0> ; 6 - неправильный КОП gate <int7 ,common,0,8Eh,0> ; 7 - отсутствие сопроцессора gate <int8 ,common,0,8Eh,0> ; 8 - двойная ошибка gate <int9 ,common,0,8Eh,0> ; 9 - перегрузка сегмента сопр. gate <int10,common,0,8Eh,0> ; 10 - неправильный TSS gate <int11,common,0,8Eh,0> ; 11 - отсутствует сегмент gate <int12,common,0,8Eh,0> ; 12 - ошибка стека gate <int13,common,0,8Eh,0> ; 13 - общая ошибка защиты gate <int14,common,0,8Eh,0> ; 14 - отсутствие страницы gate <int15,common,0,8Eh,0> ; 15 - резерв gate <int16,common,0,8Eh,0> ; 16 - ошибка сопроцессора gate 15 dup (<intXX,common,0,8Eh,0>) ; 17..31 - резерв ENDS ; ASSUME CS:Code, SS:Stk0, DS:Dat0, ES:Scr, FS:Dat0, GS:GDT SEGMENT Code ; PROC Main load_selectors_real ; проверка типа процессора pushf xor AX, AX push AX popf pushf pop AX and AX, 0F000h cmp AX, 0F000h je @@CPU_8086 mov AX, 0F000h push AX popf pushf pop AX and AX, 0F000h jz @@CPU_80286 jmp @@CPU_80386_or_better @@CPU_8086: mov DX, OFFSET mess_8086 jmp @@contunie_to_exit @@CPU_80286: mov DX, OFFSET mess_80286 @@contunie_to_exit: mov AH, 09h int 21h popf jmp @@exit @@CPU_80386_or_better: popf ; подготовка GDT и GDTR put_to_gdt Zero_D, 0 ; нулевой сегмент put_to_gdt Code_D, Code ; кодовый сегмент put_to_gdt Stk0_D, Stk0 ; сегмент стека программы put_to_gdt Dat0_D, Dat0 ; сегмент данных программы put_to_gdt Dat1_D, Dat1 ; сегмент данных задачи 1 put_to_gdt Dat2_D, Dat2 ; сегмент данных задачи 2 put_to_gdt Scr_D, Scr ; сегмент видеобуфера put_to_gdt GDT_D, GDT ; сегмент GDT put_to_gdt IDT_D, IDT ; сегмент IDT put_to_gdt TSS0_D, TSS0 ; TSS главной задачи put_to_gdt TSS1_D, TSS1 ; TSS задачи 1 put_to_gdt TSS2_D, TSS2 ; TSS задачи 2 put_to_gdt TSSD_D, TSSD ; TSS драйвера load_gdtr ; загрузка регистра GDTR ; запрещение прерываний cli_all ; переходим в защищенный режим mov EAX, CR0 or EAX, 1 mov CR0, EAX jmp_next <offset Code_D> load_selectors_protected ; загрузка TR mov AX, offset TSS0_D ltr AX ; подготовка IDT и IDTR load_idtr call Random call ClrScr PASCAL, '░', [attr1] call PutBar PASCAL, 00, ' ', [attr2] call PutBar PASCAL, 24, ' ', [attr2] call Box PASCAL, 03, 4, 37, 20, ' ', 2, \ offset Header1, [attr2], [attr3], [attr4] call Box PASCAL, 42, 4, 76, 20, ' ', 2, \ offset Header2, [attr2], [attr3], [attr4] call WriteStr PASCAL, 26, 0, offset Sym, [attr2] cycle: mov CL,7 call Random call [dword KeyDrv] ; вызов драйвера call [dword Task1] ; вызов задачи 1 call [dword Task2] ; вызов задачи 2 cmp [ScanWord],1 ; нажата Esc ? jne cycle ; нет - продолжить return_real: ; настройка границ для реального режима set_limits_real jmp_next <offset Code_D> load_selectors_protected ; переключаем . . . mov EAX, CR0 and EAX, 0FFFFFFFEh mov CR0, EAX jmp_next Code load_selectors_real ; установка IDTR на 256 прерываний реального режима ; загрузкой границы и базового адреса таблицы прерываний lidt [STD_PTR] ; разрешение прерываний sti_all call WriteStr PASCAL, 27, 24, offset Mes, [attr2] @@exit: mov AX, 4C00h int 21h ENDP Main PROC ErrorMess NEAR ; прерывание [DS:SI], BL - позиция, BH - цвет xor DI, DI mov AX, 80*2 mul BL add DI, AX cld mov AH, BH lodsb @@1: stosw lodsb cmp AL,'$' jne @@1 ret ENDP PROC Choose @@loop: in AL,60h test AL,80h ; отжата - ждем jnz @@loop cmp AL,1 ; Esc - выход jne @@1 sti jmp return_real @@1: cmp AL,28 ; Enter - возврат jne @@loop ret ENDP |
|
Вложений: 1
saovu
Ай, молодца! Серьезно, распект:up: А я вот как-то не увлекся protected mode... Немножко баловался в рамках вывода 3D-графики на видюху через Linear Buffer. А так больше на получисленные алгоритмы тянет, кот. красиво ложатся на asm. P.S. Когда-то в середине 90-х писал даже свою 3D библиотеку (см. вложение). При просмотре в виндовом блокноте использовать шрифт Terminal 14-го размера. |
Демку хоть запилите, а?
|
Вложений: 1
Лови. Только там банальный кубик, которым покрутить можно.
Более сложную и цветастую демку делать - долго и неохота... Esc - выход. F1 - помощь. F2 - нет сглаживания. F3 - сглаживание метод 1. F4 - сглаживание метод 2. F5 - сохранить в BMP. F6 - сменить видеорежим (под виндой не все режимы работают) Управление: стрелки и Ноme / End. P.S. Обратите внимание на размер EXE-шника, всего 11,5 Кбайт. |
Текущее время: 05:16. Часовой пояс GMT +3. |
|
Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2025, vBulletin Solutions, Inc. Перевод: zCarot
© 2001—2025, «Аспирантура. Портал аспирантов»