Портал аспирантов

Портал аспирантов (http://www.aspirantura.spb.ru/forum/index.php)
-   Свободное общение (http://www.aspirantura.spb.ru/forum/forumdisplay.php?f=102)
-   -   Сны воина дzена... (http://www.aspirantura.spb.ru/forum/showthread.php?t=7532)

Paul Kellerman 15.06.2011 14:55

Сны воина д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

Aspirant_Cat 15.06.2011 14:56

Ассемблер, что ли?

Paul Kellerman 15.06.2011 14:58

Он самый, родимый ;)

Aspirant_Cat 15.06.2011 14:59

И часто снится? ;)

saovu 15.06.2011 16:12

Поскольку тема про секс-символы закрыта придется мериться программами на ассемблере.

Вот исходник программы, написанной мной году в 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


saovu 15.06.2011 16:20

Продолжаем безумство цитирования исходников ...

Фрагмент программы, переводящей процессор из реального режима в защищенный

Скрытый текст



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


Ink 15.06.2011 16:22

Займитесь лучше этим делом

Paul Kellerman 16.06.2011 14:55

Вложений: 1
saovu

Ай, молодца! Серьезно, распект:up: А я вот как-то не увлекся protected mode...
Немножко баловался в рамках вывода 3D-графики на видюху через Linear Buffer.
А так больше на получисленные алгоритмы тянет, кот. красиво ложатся на asm.

P.S. Когда-то в середине 90-х писал даже свою 3D библиотеку (см. вложение).
При просмотре в виндовом блокноте использовать шрифт Terminal 14-го размера.

Ink 16.06.2011 15:42

Демку хоть запилите, а?

Paul Kellerman 16.06.2011 16:07

Вложений: 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, «Аспирантура. Портал аспирантов»