![]() |
1. Заголовок или название темы должно быть информативным
2. Все тексты программ должны помещаться в теги [CODE=asm] [/CODE]
3. Прежде чем задавать вопрос, см. "FAQ",если там не нашли ответа, воспользуйтесь ПОИСКОМ, возможно, такую задачу уже решали!
4. Не предлагайте свои решения на других языках, кроме Ассемблера. Исключение только с согласия модератора.
5. НЕ используйте форум для личного общения! Все, что не относиться к обсуждению темы - на PM!
6. Проверяйте программы перед тем, как выложить их на форум!!
![]() |
Dark |
![]()
Сообщение
#1
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 408 Пол: Мужской Репутация: ![]() ![]() ![]() |
Вот, кому интересно, взял я тему Shadow - вывод точки напрямую в видеопамять и немного изменил:
uses crt;
Const color:array[0..12,0..16] of Byte=
(
(4, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,1),
(4,24,15,15,24,24,24,15,15,15,24,15,24,24,24,15,1),
(4,15,24,22,15,24,15,24,24,24,24,15,15,24,15,15,1),
(4,15,22,24,15,24,24,15,15,24,24,15,24,15,24,15,1),
(4,15,15,15,15,24,24,24,24,15,24,15,24,24,24,15,1),
(4,15,24,24,15,24,15,15,15,24,24,15,24,24,24,15,1),
(4,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,1),
(4,15,15,15,24,24,24,15,15,15,24,24,24,15,15,15,1),
(4,15,22,24,15,24,15,24,24,24,15,24,15,24,24,24,1),
(4,15,15,15,24,24,15,15,15,15,15,24,24,15,15,24,1),
(4,15,24,22,24,22,15,24,22,24,15,24,24,24,24,15,1),
(4,15,24,22,22,22,15,24,22,24,15,24,15,15,15,24,1),
(4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,1)
);
Var
x,y,c,col:Word;
Procedure BlockOut(x,y,mx,my:Word);
Begin
asm
mov ax,0a000h
mov es,ax {es:di <- screen[0,0]}
lea si,color {ds:si <- color[0]}
mov cx,y {cx <- y}
shl cx,6 {cx <- cx * 2^6<=>y*64}
mov di,cx {di <- y*64}
shl cx,2 {cx <- cx*2^6*2^2<=>y*256}
add di,cx {di <- di+y*256}
add di,[x] {di <- di+x}
mov cx,[my] {kol-vo povtorov po y}
mov dx,[mx] {kol-vo povtorov po x}
@l1:
push cx {sohranyaem cx v steke}
mov cx,dx {pomeshatm v cx kolvo povt. po x}
rep movsb {es:[di]<-ds:[si]}{vuvodim stroku tochek}
pop cx {vostanavlivaem cx dla povtorov po y}
add di,320
sub di,mx {Vuchislaem adres sleduyshei stroki}
loop @l1 {cx<-cx-1; goto @l1}
end
end;
BEGIN
asm
mov ax,0013h
int 10h
end
repeat
blockout(random(320-17),random(200-13),17,13);
delay(700);
until keypressed;
asm
mov ah,0
int 16h
end
end.
-------------------- - Где я?
- Во тьме. - В какой тьме? - Во тьме твоего мозга. |
![]() ![]() |
GLuk |
![]()
Сообщение
#2
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 775 Пол: Мужской Репутация: ![]() ![]() ![]() |
директиву Assembler опять не поставил...
Сам просчет смещения остался стандартным, не думаю, что ты бы смог сам догадаться, что 64*y+256*y = 320*y, а там где SHL CX,2 лучше (special for someone: лучше для 8086) два раза SHL CX,1. Сам цикл вывода реализован хорошо, но это единственное, что радует... |
Dark |
![]()
Сообщение
#3
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 408 Пол: Мужской Репутация: ![]() ![]() ![]() |
На тему директивы: я тебе уже писал, что не знаю, что она делает!!!! И почему ты уверен, что я недопираю до сдвигов...??? ??? :'(
-------------------- - Где я?
- Во тьме. - В какой тьме? - Во тьме твоего мозга. |
Shadow |
![]()
Сообщение
#4
|
![]() Lonely_Raven ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 640 Пол: Мужской Репутация: ![]() ![]() ![]() |
:D
-=-= моно сказать что SHL ето деление на степени двойки и наоборот SHR уиножен -=-=- и ето почти самая быстрая команда ASM вроде -=-= -------------------- Программа делает то что вы ей приказали а не то что бы ВАМ хотелось бы.
МЕРФИ --------------------- RTFM - Read the fucking manual --------------------- http://www.livejournal.com/users/lonley_raven/ |
___ALex___ |
![]()
Сообщение
#5
|
![]() Бывалый ![]() ![]() ![]() Группа: Пользователи Сообщений: 282 Репутация: ![]() ![]() ![]() |
наоборот только
shl - умножение на степени двойки shr - целочисленное деление на степени двойки |
Shadow |
![]()
Сообщение
#6
|
![]() Lonely_Raven ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 640 Пол: Мужской Репутация: ![]() ![]() ![]() |
;D
-=-=-=-=- Бр-р-р-р-р- точно -------------------- Программа делает то что вы ей приказали а не то что бы ВАМ хотелось бы.
МЕРФИ --------------------- RTFM - Read the fucking manual --------------------- http://www.livejournal.com/users/lonley_raven/ |
GLuk |
![]()
Сообщение
#7
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 775 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата На тему директивы: я тебе уже писал, что не знаю, что она делает!!!! И почему ты уверен, что я недопираю до сдвигов...??? ??? :'( Ты ничего не подумай, я не имел в виду, что ты не понимаешь, что этот код делает. Я говорю, что сам просчет смещения, реализован не тобой... т.к. этот код я видел уже лет 6 назад и до сих пор он особо не изменялся (в плане перспективы). Или может ты его весь сам придумал ??? |
GLuk |
![]()
Сообщение
#8
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 775 Пол: Мужской Репутация: ![]() ![]() ![]() |
А по поводу директивы Assembler, дык меньше кода генерится, не знаю что за процедуру вставляет компилер перед непосредственно кодом процедуры (как- нибудь посмотрю) + не освобождается место для локальных переменных (нет enter/leave)
|
Dark |
![]()
Сообщение
#9
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 408 Пол: Мужской Репутация: ![]() ![]() ![]() |
Ok, я без обид, ;D а использование shl действительно моно встретить во многих демках и интрах, а мне дал мой наставник...
-------------------- - Где я?
- Во тьме. - В какой тьме? - Во тьме твоего мозга. |
GLuk |
![]()
Сообщение
#10
|
![]() Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 775 Пол: Мужской Репутация: ![]() ![]() ![]() |
Глянул, что делает компилер без директивы Assembler; осуществляется проверка стека...
По-поводу SHL я имел ввиду, что эта команда в виде SHL AX,1 (сдвиг всего одного бита), работает много быстрее, чем SHL AX,CL (к примеру если CX=2, то лучше написать SHL AX,1; SHL AX,1). На всякий случай эта тема была актуальна применительно к 8086/80186. |
Dark |
![]()
Сообщение
#11
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 408 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата Хорошая вещь. :) только к процедуре дай комментарий по подробней. :( Хорошая вещь. только к процедуре дай комментарий по подробней. A000 - адрес видеобуфера, Я просто организую цикл на ассемблере, выводящий точки(записывающий байты) из буфера color(адрес помещен в ds:si) в видеобуфер. Cмещение первой выводимой точки вычисляется так: di=x+y*320.(без коментариев) cx содержит кол-во строк, dx - столбцов... вывод строки - rep movsb. movsb перемещает байт из ds:[si] в es:[di] Команда movsb сама прибавляет к di и si по 1. Затем 2 команды - add di,320 sub di,mx Корректируют текущий адрес, для получения адреса начала следующей строки рисунка Вопросы? ;D -------------------- - Где я?
- Во тьме. - В какой тьме? - Во тьме твоего мозга. |
![]() ![]() |
![]() |
Текстовая версия | 23.07.2025 1:45 |