Просмотр полной версии : Сны воина дzена...
Paul Kellerman
15.06.2011, 14:55
.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
И часто снится? ;)
Поскольку тема про секс-символы закрыта придется мериться программами на ассемблере.
Вот исходник программы, написанной мной году в 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
Займитесь лучше этим делом (http://habrahabr.ru/blogs/windows/83384/)
Paul Kellerman
16.06.2011, 14:55
saovu
Ай, молодца! Серьезно, распект:up: А я вот как-то не увлекся protected mode...
Немножко баловался в рамках вывода 3D-графики на видюху через Linear Buffer.
А так больше на получисленные алгоритмы тянет, кот. красиво ложатся на asm.
P.S. Когда-то в середине 90-х писал даже свою 3D библиотеку (см. вложение).
При просмотре в виндовом блокноте использовать шрифт Terminal 14-го размера.
Paul Kellerman
16.06.2011, 16:07
Лови. Только там банальный кубик, которым покрутить можно.
Более сложную и цветастую демку делать - долго и неохота...
Esc - выход.
F1 - помощь.
F2 - нет сглаживания.
F3 - сглаживание метод 1.
F4 - сглаживание метод 2.
F5 - сохранить в BMP.
F6 - сменить видеорежим
(под виндой не все режимы работают)
Управление: стрелки и Ноme / End.
P.S. Обратите внимание на размер EXE-шника, всего 11,5 Кбайт.
PavelAR, увы, но не запускается вообще :(
Paul Kellerman
16.06.2011, 16:15
В XP вроде должна нормально запускаться.
Ладно, завтра скину что-нить другое по 3D.
Может, тут фишками какими делиться или интересными вопросами для студентов?:) Я веду "Архитектуру ЭВМ и систем", поэтому это очень актуально :)
Ощущаю дефицит в коротокоформлируемых, но требующих некоторое понимание, вопросах. Типа.
1. Создаем в Паскале короткий (но лучше длинный, если время есть) цикл:
for i:=1 to 20 do
begin
a:=a+b;
b:=a+b;
end;
При выполнении по шагам с удивлением обнаруживаем, что на первом проходе переменная i равна не 1, как мы написали в коде, а, наоборот, 20. Почему?
2. Что делает следующий ассемблерный код:
mov ch,5
mov ah, 51h
xor al,al
sub ah,ch
int 21h
В XP вроде должна нормально запускаться
Я думаю, дело не в операционной системе, а в неполной поддержке VESA VBE современными видеокартами.
Добавлено через 4 минуты
Создаем в Паскале короткий (но лучше длинный, если время есть) цикл:
for i:=1 to 20 do
begin
a:=a+b;
b:=a+b;
end;
При выполнении по шагам с удивлением обнаруживаем, что на первом проходе переменная i равна не 1, как мы написали в коде, а, наоборот, 20. Почему?
gav, что за ерунда, она должна быть равна 1 и она равна 1 - я даже проверил.
Переменные i,a,b как объявлены ?
saovu,
Переменные i,a,b как объявлены ?
i - целочисленная, например, integer или byte;
a,b - не важно какие, например, тоже integer
gav, что за ерунда, она должна быть равна 1 и она равна 1 - я даже проверил.
А вот это интересно! Проверили где, компилятор какой?
Проверили где, компилятор какой?
Старый добрый Досовый Borland Pascal.
Добавлено через 15 минут
Проверил в Delphi.
Да, 20.
Видимо оптимизация цикла так работает (на ноль проверять выгоднее) в случае когда переменная цикла внутри не используется.
saovu, Старый добрый Досовый Borland Pascal.
Странно, Турбо Паскаль седьмой как и восьмой Дельфи, дает 20 :) Странно, что, вроде бы, в более новом, чем Турбо, Борланд Паскале не так.
Видимо оптимизация цикла так работает (на ноль проверять выгоднее) в случае когда переменная цикла внутри не используется.
Совершенно верно :) Только для ответа на вопрос запрещаю смотреть соответствующий ассемблерный код.
Может, поделитесь подобными вопросиками?:)
Может, поделитесь подобными вопросиками?
Ну разве может это сделать
невоспитанно-аморальный тип saovu
?
:)
А серьезно - нет у меня таких вопросов в готовом виде.
Для преподавания мне они точно не нужны - видели б вы тех студентов, с которыми я работаю.
Дай Б-г там к 5-му курсу двое-трое из группы такие вопросы осилят.
Смешно сказать: на этой специальности готовят какбыпрограммистов (Специальность в дипломе "Математик. Системный программист"), а из всех преподов кафедры, программистов с профильным ВО и боевым опытом - только я (да и я уволюсь сейчас нахрен).
Так вот студентов на 1-ом курсе учать, что в языке C "#include <xxx.h>" означает ПОДКЛЮЧЕНИЕ БИБЛИОТЕК.
Я конечно пытаюсь переучивать (я на 2-ом курсе) - понимает (да и вообще пытается и хочет понять) один из десяти.
Так что "вопросики" я могу приводить только из своего же студенческого прошлого или трудовой деятельности. А это вспоминать надо.
Но если уж очень хотите, вот сходу пара вопросов. По тем ассемблерным листингам, что я привел.
1. Код из первого листинга
Old_2Fh_Vector:
Entry:
jmp near ptr Begin ; эта команда занимает три байта
fourthbyte db 0
Old_17h_Vector dd 0
Пояснить шо значат эти танцы с двумя метками Old_2Fh_Vector и Entry (метка, кстати, могла бы быть и одна, две - для ясности)
2. Код из второго листинга
MACRO Jmp_Next seg ; очистка очереди команд
db 0EAh ; jmp
dw $+4 ; адрес следующей команды
dw seg ; сегмент или селектор
ENDM
Что вообще означает код в этом макросе, и для чего-почему он используется строго СРАЗУ ЖЕ после включения защищенного режима процессора.
Paul Kellerman
17.06.2011, 11:26
for i:=1 to 20 do
begin
a:=a+b;
b:=a+b;
end;
Да, короче всего код для "нисходящего" цикла.
mov ecx,20
a0:
add eax,ebx
add ebx,eax
loop a0
Комнада loop уменьшает ecx на 1 и если результат больше 0, то переход на метку а0.
А компиляция "в лоб" дала бы более длинный код:
mov ecx,1
a0:
add eax,ebx
add ebx,eax
inc ecx
cmp ecx,20
jbe a0
mov ch,5
mov ah, 51h
xor al,al
sub ah,ch
int 21h
Аффтар кода шутник, однако ;) Код эквивалентен коду:
mov ax,4C00h
int 21h
Короче стандартное завершение DOS-программы (код возврата = 0).
Old_2Fh_Vector:
Entry:
jmp near ptr Begin ; эта команда занимает три байта
fourthbyte db 0
4-байтная переменная, для хранения адреса (16-битный сегмент: 16-битное
смещение) обработчика прерывания, по совместительству выполняющая роль
исполняемого кода (jump на метку begin). При установке новых обработчиков
переменная разумеется модифицируется, и уже не годится для исполнения :)
MACRO Jmp_Next seg ; очистка очереди команд
db 0EAh ; jmp
dw $+4 ; адрес следующей команды
dw seg ; сегмент или селектор
ENDM
Дальний jump по абсолютному адресу, который вычисляется на этапе компиляции.
16-битное смещение зависит от положения точки применения макроса в исходном
коде, 16-битный сегментный адрес берется из того, что передается как параметр,
который тоже подставляется на этапе компиляции. Подобный прием используется
везде, где требуется сбросить конвейер процессора, чтобы избежать конфликтов.
Аффтар кода шутник, однако
Не знаю. По мне так, скучная задачка на устный счёт.
Paul Kellerman
17.06.2011, 11:34
А вообще с макросами я тоже раньше любил поизголяться. Было время, когда
писал свой макросовый "add-on" для Turbo Assembler, чтобы можно было в про-
граммах использовать SSE-инструкции процессора Pentium III, который тогда
только-только вышел, 97-й кажись год был, и очень хотелось SSE попробовать.
Вообще-то решений тут я и не ждал (gav просил вопросики).
Но раз пошла такая пьянка.
Дальний jump по абсолютному адресу, который вычисляется на этапе компиляции.
16-битное смещение зависит от положения точки применения макроса в исходном
коде, 16-битный сегментный адрес берется из того, что передается как параметр,
который тоже подставляется на этапе компиляции. Подобный прием используется
везде, где требуется сбросить конвейер процессора, чтобы избежать конфликтов.
Да, разумеется.
Кстати, это вполне официальный способ рекомендуемый Интелом для очистки конвейера команд. Я так понимаю, что особую команду для этого заводить не стали (для экономии, ага; тем более она бы использовалась крайне редко) - поскольку уже есть побочное действие другой команды, дающее нужный результат.
На последнюю часть вопроса
для чего-почему он используется строго СРАЗУ ЖЕ после включения защищенного режима процессора
не ответили :)
4-байтная переменная, для хранения адреса (16-битный сегмент: 16-битное
смещение) обработчика прерывания, по совместительству выполняющая роль
исполняемого кода (jump на метку begin). При установке новых обработчиков
переменная разумеется модифицируется, и уже не годится для исполнения
Это верно.
На самом деле смысл этого кода в экономии 4 байт.
Переменная будет объявлена и затрет программный код, который уже точно не будет нужен к моменту использования переменной.
saovu, да, хорошие вопросики. особенно про конвейер команд, возьму на вооружение, вот нечто подобное и нужно :)
А насчет устного счета, то это скорее против непонятно откуда взявшейся проблемы.
Определенный процент студентов каждый год, почему то считает, что в паре
mov ax,4c00h
int 21h
Именно первая команда завершает работу досовской программы. При том, что команда mov - самая популярная в различных примерах. Этот пример достаточно эффективно отрезвляет.
Определенный процент студентов каждый год, почему то считает, что в паре
mov ax,4c00h
int 21h
Именно первая команда завершает работу досовской программы
Зная нонешних студентов - охотно верю.
Между делом хотелось бы узнать: для чего нужны вот такие профессиональные видеокарты (http://www.ozon.ru/context/detail/id/6257787/) и почему они так дорого стоят?
для чего нужны вот такие профессиональные видеокарты
ну там же написано
приложениях проектирования, анимации и видеообработки.
почему они так дорого стоят
Видеокарта PNY Quadro 5000 2560MB оснащена 2,5 Гб графической памяти GDDR5, 352 процессорами параллельных вычислений NVIDIA CUDA и передовой архитектурой Fermi.
352 процессора - не шутки.
saovu, а обычная видеокарта? Ведь она то же может работать в
приложениях проектирования, анимации и видеообработки.
Т.е всё дело в
352 процессора
?
А практическое применение?
Графика это такое дело, что "чем больше, тем лучше" и разумный предел наступит только когда будет достигнута реалистичность (тавтология) реального мира.
gav, да в ответе на вопросик про две метки, я оговорился: смысл кода в экономии 3 байт ! (а не четырёх)
Поскольку PavelAR не появляется, то сам же отвечу на последнюю часть вопроса про конвейер.
Код очистки конвейера используется строго СРАЗУ ЖЕ после включения защищенного режима процессора потому что в конвейер выбраны команды с адресацией (для тех команд где в качестве операндов - адреса) по правилам реального режима, а переключение в защищенный режим меняет, в том числе, все правила адресации.
Paul Kellerman
20.06.2011, 09:11
что в конвейер выбраны команды с адресацией (для тех команд где в
качестве операндов - адреса) по правилам реального режима
Угу, адресация в защищенном режиме на порядок, а то и на два порядка сложнее
(если страничная адресация еще включена). JMP в вышеуказанной форме помимо
сброса конвейра заставляет еще в CS новый селектор загрузить, насколько помню.
Зная нонешних студентов - охотно верю
Некоторые даже уверены, что сначала появилась винда, графический интерфейс,
ворд-эксель, а уж потом специально ради всего этого придумали процессоры x86 ;)
В этом семестре мне студенты заявили, что задание одной из лабораторок "Написать программу нахождения обратной матрицы ..." совершенно невыполнимо.
Принес (шоб им стыдно стало) показать выполненную мной (в 1995 году и тоже на 2-ом курсе) аналогичную работу, причем еще и с весьма навороченным UI в текстовом режиме (чего в данном случае от них точно не требовалось).
Студенты притихли. Работу, правда, всё равно не выполнили.
Вот, прилагаю свое творение.
Ну и вдогонку тогда.
Программа решения транспортной задачи, с аналогичным текстовым интерфейсом, но еще чуть более изощренным (специфика задачи).
Задумался - куда поместить это видео: то ли в тему про Мутко (гыгыг), то ли просто в юмор. Ну да пусть будет здесь.
Kris Kaspersky — Remote Code Execution Through Intel CPU Bugs (http://static.video.yandex.ru/lite/matros0ff/wp2dsb33kk.613/)
Kris Kaspersky
Не далее чем сегодня мной уже упоминался...:)
Не далее чем сегодня мной уже упоминался
Это верно, именно по ассоциации и вспомнил видео (виденное мной в ссылке во время бана - вместо чтения ПСС Ленина)
[Задумчиво] А мы ведь с ним знакомы.
А мы ведь с ним знакомы
Эт как ? Он ведь живет далёко от вас.
Неужели "по работе" ? Отдел "К" ?
Multi-Dimensional Analog Literals (http://weegen.home.xs4all.nl/eelis/analogliterals.xhtml)
(там средствами языка C++ реализована смешная идея: числовая величина одномерной константы прямо пропорциональна ее длине, двумерной - ее площади, трехмерной - ее объему)
Эх... А я вот до сих пор пишу на асме... Под AVR и даже Cortex...
Но стараюсь таки на Си :)
А писюки меня не возбуждают. Не интересно их программить... :shuffle:
Добавлено через 9 минут
Kris Kaspersky — Remote Code Execution Through Intel CPU Bugs
Помню, в германии так один чувак всех горячо брагодарил. Больше всего запомнился артикль the, который он произносил не иначе как зЭ, причём перед именами собственными: зЭ Брайан, зЭ Пол и т.д.
Мы потом ещё пару лет на работе друг друга в шутку называли "зЭ Фомин" и т.д. :)
AVR и даже Cortex
...
А писюки меня не возбуждают. Не интересно их программить
Какой-то слишком "подростковый" подход. (Не в обиду будет сказано)
Аппаратная платформа выбирается исходя из требований ведь.
Хотя (в эмоциональном смысле) у микроконтроллеров действительно есть свое очарование: программы сравнительно просты, букет используемых технологий - минимален, в распоряжении "задачи" как правило находится всё устройство целиком.
Аналогичная задача на полноценной ПЭВМ если и будет решаться, то при массе ограничений, зато с конгломератом используемых технологий, вообще с большой вариативностью (как правило) выбора технологий, с решением таких "почтенных" задач как борьба со слоями ПО лежащими между своей софтиной и голым железом и т.п.
Приходит на ум аналогия с искусством: минимализм vs барокко.
Эк я загнул, прям хоть статью пиши "Об эмоциональном и чувственном в разработке программного обеспечения"
P.S.
писюки меня не возбуждают
В цитатник форума метили ? :D
Попалось тут ...
Выражение
char*const a,b;
некорректное в C++, допустимо в C (без плюсов).
Из-за различной семантики квалификатора const.
Какой-то слишком "подростковый" подход.
Ни разу.
В МК я полностью владею ситуацией и могу импровизировать. В ПК 90% программ, это сбор из готовых кубиков замка - кривого, квадратного, но как-то стоящего.
Ну как конструктор лего и настоящие модели ;)
Опять же, программеры современные всё больше по явам и билдерам убиваются, где программирование ограничивается тасканием по форме компонентов.
Аппаратная платформа выбирается исходя из требований ведь.
Писюки не имеют аппаратной платформы, они имеют ОС ;) А ОС, это винда. А с виндой я вообще не люблю ничего общего иметь...
программы сравнительно просты,
Бгы. Просты. Это смотря что и где.
В МК я полностью владею ситуацией и могу импровизировать
Если бы вы внимательно прочли мое сообщение, то должны бы были понять, что именно об этом я и пишу.
Писюки не имеют аппаратной платформы, они имеют ОС А ОС, это винда.
Этот поток сознания даже комментировать не буду.
то должны бы были понять, что именно об этом я и пишу.
Не об этом. Точнее, не совсем.
В МК я импровизирую не только софтово, но и железно. Я могу опрашивать 32 кнопки клавиатуры одной лапой, могу сделать АЦП из логического входа и т.д. Есть над чем плющить мозг в том числе и со схемотехнической точки зрения.
В ПК ты в этом ограничен. По этому я не люблю всякие борды под линукс с уже всем на борту. За редким исключением.
Этот поток сознания даже комментировать не буду.
Ну, это всё от недостатка знаний ;)
Ну, это всё от недостатка знаний
Со своими неумными попытками развязывания срачей идите в другие темы.
Единственная кажется, не загаженная тема осталась ...
mkdir \\.\drive letter:\nul
mzDTZuFJYX4
Даже не знаю как комментировать.
"Железячный дзен", "изврат высокой пробы", "интересный фокус", etc.
Вчера в процессе общения с коллегами, сгенерил шутку йумора:
"Души людей, при жизни нарушавших теорему Котельникова, после смерти попадают в частотную область"
В ПК 90% программ, это сбор из готовых кубиков замка - кривого, квадратного, но как-то стоящего.
Так это же как бы и суть объектно-ориентированного программирования. Как бы преимущество - переиспользование кода, чтобы каждый раз не писать заново код ("велосипед").
Kris Kaspersky — Remote Code Execution Through Intel CPU Bugs
Начал смотреть видео и подумал - почему такой худой Касперский? Оказывается, это вообще другой известный человек под псевдонимом. Прочитал про него в Википедии
Так это же как бы и суть объектно-ориентированного программирования. Как бы преимущество - переиспользование кода, чтобы каждый раз не писать заново код ("велосипед").
Что за ерунда ? Это суть НЕ объектно-ориентированного программирования.
Это совсем другие принципы.
Как бы преимущество - переиспользование кода,
Любой нормально оформленный Си код не только реюзибл в пределах семейства МК, но даже в пределах ряда семейств.
Про ПК вообще молчу. Чтобы сделать код из студии, например, НЕ реюзибл, надо специальные усилия прилагать.
Объектно ориентированное программирование ещё в паскале 7,1 делалось. Кубики билдера, это другое.
Любой нормально оформленный Си код не только реюзибл в пределах семейства МК, но даже в пределах ряда семейств.
Про ПК вообще молчу. Чтобы сделать код из студии, например, НЕ реюзибл, надо специальные усилия прилагать.
Объектно ориентированное программирование ещё в паскале 7,1 делалось. Кубики билдера, это другое.
Хотя часть мыслей верна (потому как тривиальна), но зачем камментить по вопросам, где имеешь уровень знаний-умений-навыков на уровне "продвинутого" школьника ?
Я тоже не понимаю что ты в этой ветке делаешь. Так что мы наконец нашли общую точку зрения.
Вот рассказики писать у тебя лучше получается...
Я не хочу превращать эту тему в помойку, поэтому не стану отвечать так, как действительно того заслуживает торговец Родиной.
А по "сабжу" замечу, что ты многократно тут оконфузился, так что реальные специалисты сами сделают все правильные выводы.
Было б ещё чем торговать...
vBulletin® v3.8.8, Copyright ©2000-2025, vBulletin Solutions, Inc. Перевод: zCarot