Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ASM - с чего начать? 
:(
    Опции темы
Chingachguk
Дата 9.11.2002, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: 11
Всего: 18



Вот подпрограмма, которая позволяет сформировать изображение строки по адресу ds:[di] числа в регистре ax в шестнадцатеричном представлении:

HexChar proc near
 pusha ; Внимание: команды процессора 286. В паскале нужен ключ {G+}
 mov  cx,4
 mov  bx,offset TabHex
@GetHex:
 rol  ax,4
 push ax
 and  al,0fh
 xlat
 mov  [di],al
 inc  di
 pop  ax
 loop @GetHex
 popa
 retn
TabHex  db '0123456789abcdef'
HexChar endp

А вот пример вызова этой процедуры: пусть мы хотим вывести содержимое регистра es:


 mov  ax,es
 mov  di,offset MyString+4
 call   HexChar

MyString db 'es: ????$'

После этого мы можем легко вывести ее на экран:

 mov  ah,09h
 mov  dx,offset MyString
 int    21h


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
Ramstar
Дата 7.12.2002, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 13
Регистрация: 7.12.2002

Репутация: нет
Всего: 1



Win95chih модифицируйте а потом в нет выложите и все дела и будет мир играть в войну :p
PM MAIL   Вверх
dr.ZmeY
Дата 13.12.2002, 08:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Политолог
****


Профиль
Группа: Участник Клуба
Сообщений: 3892
Регистрация: 26.3.2002
Где: ..::STALINGRAD::. .

Репутация: нет
Всего: 60



Chingachguk, в чём различая вывода на экран в режиме записи 1 и 2, если можно, на примере поясни...


--------------------
PM MAIL WWW ICQ Skype   Вверх
Chingachguk
Дата 17.12.2002, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: 11
Всего: 18



Цитата

Snick_Y2K Дата сообщения: 13.12.2002,00:24
Chingachguk, в чём различая вывода на экран в режиме записи 1 и 2, если можно, на примере поясни...


Я не совсем понял, что ты имеешь в виду. Если ты про то, что

Цитата

{Кусок рисования}
mov ax,0AC80h
mov es,ax
mov bx,0 {Начальное смещение ! - опять нуль !}
@Repeat:
mov byte ptr es:[bx],14
add bx,1
cmp bx,319 {Внимание ! Мы изменили и эту команду ! - вернули !}
jbe @Repeat
{Кусок рисования - Закончен}


так тут (собственно, в уроке 3 про это и рассказывается) идет речь о том, в процессоре адрес ячейки памяти формируется из двух частей - регистров: сегментного и смещения:

Адрес = сегментный регистр * 16 + регистр смещения;

Причем смещение может быть задано в самой команде или же построено даже из комбинации нескольких регистров (максимум - 2-х) и смещения !

Таким образом, раз мы задаем адрес из двух частей, то мы можем играться обеими частями таким образом, то общий адрес будет одним и тем же !

Вот там-то и был пример этого: можем рисовать одно и то же (заносить в одну и ту же память числа) двумя способами(или большим числом):

1. Задав сегмент равным 0A000h:

Цитата

{Кусок рисования}
mov ax,0A000h
mov es,ax
mov bx,160*320 {Начальное смещение = 160*320, линия 160}
@Repeat:
mov byte ptr es:[bx],14
add bx,1
cmp bx,319+160*320
jbe @Repeat
{Кусок рисования - Закончен}


2. Так, как приведено выше, те в сегментный регистр заноситься другое число, но такое, что:

0A000h x 16 + 320*160 = 0AC80h x 16 + 0
    |                                  |
   es                                 es


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
dr.ZmeY
Дата 19.12.2002, 08:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Политолог
****


Профиль
Группа: Участник Клуба
Сообщений: 3892
Регистрация: 26.3.2002
Где: ..::STALINGRAD::. .

Репутация: нет
Всего: 60



Вот пример установки режима записи 2:
Код
MOV DX,3CEH  ;указываем на регистр адреса
MOV AL,5  ;инедксируем регистр 5
OUT DX,AL  ;посылаем индекс
INC DX  ;указываем на регистр режима
MOV AL,2  ;выбираем режим записи 2
OUT DX,AL  ;устанавливаем режим


Код

;---рисуем красную точку в левом верхнем углу экрана
MOV AX,0A000H  ;адрес буфера
MOV ES,AX  ;
MOV BX,0  ;указываем на первый байт буфера
;---установка регистра маски битов
MOV DX,3CEH  ;указываем на адресный регистр
MOV AL,8  ;регистр маски битов
OUT DX,AL  ;адресуем регистр
INC DX  ;указываем на регистр данных
MOV AL,10000000B  ;маскируем все биты, кроме 7-го
OUT DX,AL  ;посылаем данные
;---рисуем красную точку
MOV AL,ES:[BX]  ;заполняем регистры задвижки
MOV AL,4  ;красный цвет
MOV ES:[BX],AL  ;рисуем точку


Режим записи 1:  
Код
;---копируем строку в следующую строку
MOV CX,80  ;число байтов в строке
MOV BX,0  ;начинаем с 1-го байта буфера
MOV AX,0A000H  ;адрес буфера
MOV ES,AX  ;
NEXT_BYTE: MOV AL,ES:[BX]  ;заполняем задвижку
MOV ES:[BX]+80,AL  ;выводим в следующую строку
INC BX  ;переходим к следующему байту
LOOP NEXT_BYTE  ;


с точкой всё выходит, но при попытке создать линию, в режиме записи 2 на экран выдается какая-то хрень, а точнее точки находящиеся на расстоянии, а в графическом режиме 0013h и того хуже...


--------------------
PM MAIL WWW ICQ Skype   Вверх
NightGoblin
Дата 25.12.2002, 16:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1021
Регистрация: 24.11.2002
Где: 127.0.0.1

Репутация: нет
Всего: 11



Цитата(Chingachguk @ 09.11.2002, 11:40)
Вот подпрограмма, которая позволяет сформировать изображение строки по адресу ds:[di] числа в регистре ax в шестнадцатеричном представлении:
...

Если немного оптимизировать:

HexChar proc near
 pusha ; Внимание: команды процессора 286. В паскале нужен ключ {G+}
 mov  cx,4
;;  mov  bx,offset TabHex
@GetHex:
 rol  ax,4
 push ax
 and  al,0fh
;;  xlat
;; Тут:
 cmp  al, 10
 sbb  al, 69h
 das
;; ---
 mov  [di],al
 inc  di
 pop  ax
 loop @GetHex
 popa
 retn
;; TabHex  db '0123456789abcdef'
HexChar endp


--------------------
Kernel panic: /dev/null overflow!
GCS/IT/MU/O d-@ s: a- C++$>++++$ ULSB(+++) P+++ L+++>++++ !E W++(-) N o? K w-- O? M>+ V? PS+ PE Y+ PGP+>+++ t- 5 X+ R- !tv b+ DI+ D+ G e++ h--- r++ y?
B4F1 54B6 8738 26CD 5125 0581 B923 9273 FE59 1981
PM MAIL WWW ICQ   Вверх
Chingachguk
Дата 26.12.2002, 19:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: 11
Всего: 18



to Snick_Y2K:

У меня где-то дома валялся код для работы с битовыми плоскостями, все никак не донесу ;) Но будет ! А в 13h режиме вроде тока палитру менять через порты можна ;) Точки делать нужно просто через mov(movs).

to NightGoblin:

Ага, это известная фича. А вот слабо оптимизнуть вот эта:

Цитата

; Форматирование десятичного числа
 mov  di,offset NumBuff
 xor  ax,ax
 mov  al,[si].Head
 call DecChar
...
DecChar proc near
 pusha
 mov  cx,5
 mov  bx,10000
@GetDec:
 xor  dx,dx
 div  bx
 add  al,'0'
 mov  [di],al
 inc  di
 push dx
 xor  dx,dx
 mov  ax,bx
 mov  bx,10
 div  bx
 mov  bx,ax
 pop  ax
 loop @GetDec
 popa
 retn
DecChar endp



--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
NightGoblin
Дата 31.12.2002, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1021
Регистрация: 24.11.2002
Где: 127.0.0.1

Репутация: нет
Всего: 11



2 Chingachguk:

Честно говоря, реально оптимизировать, наверное, действительно слабо :) Но я тут порылся немножко, нашел одно место... Если где приемник с источником спутаю - мне пришлось с Intel'а на AT&T переводить и обратно, так как с nasm разбираться, а тем более ставить DOS, лень... :) В общем, так должно быть немножко быстрее... Да, заодно сделал на 32-битных регистрах, так что максимальное значение числа 4G вместо 64K :)

Код

DecChar32 proc near

pushad
xor ecx, ecx
mov cl, 10
mov ebx, 1000000000
GetDec32:
xor edx, edx
div ebx
add al, 30h
mov byte ptr [edi], al
inc edi
push edx
mov eax, ebx
mov edx, 429496730
mul edx
mov ebx, edx
pop eax
loop GetDec32
popad
ret

DecChar32 endp


:)


--------------------
Kernel panic: /dev/null overflow!
GCS/IT/MU/O d-@ s: a- C++$>++++$ ULSB(+++) P+++ L+++>++++ !E W++(-) N o? K w-- O? M>+ V? PS+ PE Y+ PGP+>+++ t- 5 X+ R- !tv b+ DI+ D+ G e++ h--- r++ y?
B4F1 54B6 8738 26CD 5125 0581 B923 9273 FE59 1981
PM MAIL WWW ICQ   Вверх
ARTi
Дата 7.1.2003, 10:20 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Вопрос: как наиболее универсально инициализировать звуковуху? То есть, предполагается, что в системе стоит нечто совместимое с SB и работа идет с ним или же нет?
Ситуация такая: был (и сейчас есть) эмуль ZX Spectrum под DOS в защищенном режиме. Хочется перевести его под DPMI, а винда его как раз поддерживает. В dos'е тоже можно запустить cwsdpmi.exe - и вот вам dpmi под dos. Так вот, в досе ясное дело как работать с звуковухой, а вот в винде он не везде эмулируется или эмулируется, но через зад.
Есть ли универсальный способ работы со звуковухой и в досе, и в виндах?

P.S. Если кто хочет, выложу всякие процедурки для работы с экраном.

P.P.S. А причем, извиняюсь, этот ... паскаль? Он к асму вообще никакого отношения не имеет, разве что только всего лишь поддерживает...
  Вверх
XpyDi
Дата 7.1.2003, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 114
Регистрация: 25.11.2002
Где: USSR

Репутация: нет
Всего: 2



Цитата
Есть ли универсальный способ работы со звуковухой и в досе, и в виндах?

смотря какие винды, хотя лучше попробовать впихнуть в этот эмуль свои нормальные процедуры для работы со звуковой картой.
Цитата
P.S. Если кто хочет, выложу всякие процедурки для работы с экраном.

Говорю только за себя. Мне лично не нужно.
Цитата
P.P.S. А причем, извиняюсь, этот ... паскаль? Он к асму вообще никакого отношения не имеет, разве что только всего лишь поддерживает...

Не всем легко сразу пересесть на ассемблер, а когда знаешь паскаль, то с ассемблерными вставками проще понять как это работает(по крайней мере на первых порах).
PM MAIL WWW ICQ   Вверх
ARTi
Дата 7.1.2003, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 7.1.2003

Репутация: нет
Всего: нет



Цитата
смотря какие винды, хотя лучше попробовать впихнуть в этот эмуль свои нормальные процедуры для работы со звуковой картой

Желательно любые винды. Но в 98-х поддержки SB в DOS-окне у меня почему-то нет (звуковуха - Audigy), а вот в XP есть, но с горем пополам. То есть, кто-то определяет, а кто-то нет, более того, звук, если и есть, то очень прерывистый, до тех пор, пока не повысишь приоритет до real time, но тогда уже ничего нельзя делать - просто сидеть и смотреть в экран...

Цитата
а когда знаешь паскаль, то с ассемблерными вставками проще понять как это работает

В смысле? Когда знаешь "волшебные" слова BEGIN и END ?
PM MAIL   Вверх
NightGoblin
Дата 8.1.2003, 09:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1021
Регистрация: 24.11.2002
Где: 127.0.0.1

Репутация: нет
Всего: 11



Цитата(ARTi @ 07.1.2003, 13:51)
Желательно любые винды. Но в 98-х поддержки SB в DOS-окне у меня почему-то нет (звуковуха - Audigy), а вот в XP есть, но с горем пополам. То есть, кто-то определяет, а кто-то нет, более того, звук, если и есть, то очень прерывистый, до тех пор, пока не повысишь приоритет до real time, но тогда уже ничего нельзя делать - просто сидеть и смотреть в экран...

Как правило, делается это через DMA - тогда таких проблем не будет. Общий принцип такой - пишешь в память кусок файла (.wav например), потом даешь звуковухе команду считывать данные оттуда через DMA (прямой доступ к памяти). Когда она доходит до конца, вызывает прерывание, обработчик которого пишет в память следующий кусок и так далее. Если очень надо, могу замылить файлик, воспроизводящий один .wav под DOS - не свой, правда, но, надеюсь, пойдет :)


--------------------
Kernel panic: /dev/null overflow!
GCS/IT/MU/O d-@ s: a- C++$>++++$ ULSB(+++) P+++ L+++>++++ !E W++(-) N o? K w-- O? M>+ V? PS+ PE Y+ PGP+>+++ t- 5 X+ R- !tv b+ DI+ D+ G e++ h--- r++ y?
B4F1 54B6 8738 26CD 5125 0581 B923 9273 FE59 1981
PM MAIL WWW ICQ   Вверх
ARTi
Дата 9.1.2003, 04:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 7.1.2003

Репутация: нет
Всего: нет



NightGoblin
Спасибо, но я, в общем-то, в курсе :). Просто в моей проге до этого даже дело не доходит (автодетект никак не может определить irq), а в других всяких там игрушках под дос, где, я думаю, все делается как раз правильно, звук прерывистый и искаженный.
В принципе, я вот думаю - ну сделаю я этот автодетект, но у меня, видимо, будет такой же искаженный звук как и везде. А привязываться именно к винде не хотелось бы.
PM MAIL   Вверх
NightGoblin
Дата 12.1.2003, 19:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1021
Регистрация: 24.11.2002
Где: 127.0.0.1

Репутация: нет
Всего: 11



[offtopic]

Кстати, я вот смотрю - книга Зубкова С. В. - хорошая, стало быть, штука, раз ее все примером приводят :) Я правда в ней опечаток нашел несколько штук (в кодах), но мне так тоже очень даже помогла в освоении этого нехитрого, но, вместе с тем, коварного языка ;-)


--------------------
Kernel panic: /dev/null overflow!
GCS/IT/MU/O d-@ s: a- C++$>++++$ ULSB(+++) P+++ L+++>++++ !E W++(-) N o? K w-- O? M>+ V? PS+ PE Y+ PGP+>+++ t- 5 X+ R- !tv b+ DI+ D+ G e++ h--- r++ y?
B4F1 54B6 8738 26CD 5125 0581 B923 9273 FE59 1981
PM MAIL WWW ICQ   Вверх
ARTi
Дата 21.1.2003, 08:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 6
Регистрация: 7.1.2003

Репутация: нет
Всего: нет



Да, книга Зубкова - достаточно крутая, вот если б ее лет эдак 7-8 назад...
А то все так: документаций нет - добываешь инфу кропотливым трудом и намеренными страданиями ;), а потом - бац! - так необходимая когда-то дока тут как тут!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.1142 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.