Техническая поддержка :

Современные решения

для защиты Windows программ

и восстановления исходного кода
Автор: xen. Дата публикации: 10.08.2004

Пишем напрямую в видеопамять



CODE NOW!

; полностью завершенная COM-программа
codeseg segment
assume cs:codeseg, ds:codeseg, es:codeseg
org 100h
Code: jmp Start
x dw 50 ;координата x выводимого текста
y dw 20 ;координата y выводимого текста
Text db 'string to be printed',0 ;не забываем 0
Start:
mov AX,80 ;вычисляем адрес
mul y
add AX,x
shl AX,1 ;адрес в AX=160*y+2*x
mov DI,AX
mov SI,offset Text
push ES ;сохраняем ES
mov AX,0B800h ;сегмент экранной памяти в текстовом режиме
mov ES,AX
Print:
lodsb ;загружаем AL из DS:[SI]
or AL,AL ;конец строки?
jz Ready ;да, AL=0
mov ES:[DI],AL ;символ для отображения
add DI,2 ;пропускаем байт атрибутов
jmp Print
Ready: pop ES ;восстанавливаем ES
;---------------------------------------
int 20H
codeseg ends
end Code






Комментарии

Добавил: GPcH Дата: 12.10.2004

Вот тут один мой знакомый нашел баг в статье.
И написал приме, лишенный недостатков, который к тому же рисует на экране фигуры Лиссажу

uses crt;
const pi:real=3.1415926536;
var
t:real;
x,y,x1,UmX,UmY,Faza:integer;
procedure PutPixel (x,y:integer;Color:byte);
var
i:integer;
DecI,Temp:real;
Bit:byte;
begin
if y mod 2 = 1 then
begin
inc(y);
DecI:=(80*(y/2)+(x/4))+8112;
Temp:=frac(DecI)*8;
Bit:=6-trunc(Temp);
i:=trunc(DecI);
dec(y);
end;
if y mod 2 = 0 then
begin
inc(y);
DecI:=80*((y/2)-0.5)+(x/4);
Temp:=frac(DecI)*8;
Bit:=6-trunc(Temp);
i:=trunc(DecI);
dec(y);
end;
asm
mov ax, 0b800h
mov es, ax
mov di, i
mov al, byte ptr(es:di)
mov cl, Bit
ror al, cl
mov ah, Color
and al, 11111100b
add al, ah
rol al, cl
mov byte ptr(es:di), al
end;
end;
begin
UmX:=80;
UmY:=80;
asm
mov ax,4
int 10h
end;
repeat
repeat
{delay(5);}
y:=trunc(UmY*sin((2*pi*1500*t)*pi/180))+100;
x:=trunc(UmX*sin((2*pi*1000*t+Faza)*pi/180))+160;
x1:=trunc(UmX*sin((2*pi*1000*t+(Faza-1))*pi/180))+160;
PutPixel (x1,y,0);
PutPixel (x,y,1);
t:=t+0.0008;
until(t](145*0.0008));
t:=0;
inc(Faza);
if Faza=360 then Faza:=0;
until(keypressed);
end.

Добавил: GPcH Дата: 12.10.2004

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


Добавление комментария


Ваше имя (на форуме):

Ваш пароль (на форуме):

Комментарии могут добавлять только пользователи,
зарегистрированные на форуме данного сайта. Если Вы не
зарегистрированы, то сначала зарегистрируйтесь тут

Комментарий:





Главная     Программы     Статьи     Разное     Форум     Контакты