|
|
|
Wowa |
|
|||
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
Посоветуйте что-нибудь.
|
|||
|
||||
Fantasist |
|
|||
Лентяй Профиль Группа: Участник Клуба Сообщений: 1517 Регистрация: 24.3.2002 Репутация: нет Всего: 41 |
Chingachguka! Chingachguka на сцену. Пусть дла начала свои уроки запостит.
-------------------- Волны гасят ветер... |
|||
|
||||
Vit |
|
|||
Vitaly Nevzorov Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: нет Всего: 207 |
Это точно, начинать надо с Chingachguka
-------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
neutrino |
|
|||
Gothic soul Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
Est takaia bolshaia kniga Toma Svana (Tom Swan) nazivaetsia "programmirovanie v Turbo Assembler". Ochen podrobnoe opisanie. Kucha primerov i poniatno napisannaia.
Rekomenduiu. -------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
О ! Всем привет ! ))
Так что, можно продолжить ?! Оки ! Ниже пошел первый Урок. -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Урок 1. Немного порисуем.
Итак, начнем. Запустите tp7(или более младшие версии, где можно писать asm end; - и компиллер не ругнется). Tp7 Вы можете взять тут(~550Кил): http://chat.ru/~vzubko/tp7.zip Наберите следующий код: begin {Устанавливаем графический режим монитора 13h, 320x200, 256 цветов} asm mov ax,0013h int 10h end; asm mov ax,0A000h mov es,ax {Рисуем - раз} mov byte ptr es:[320*10+10],12 mov byte ptr es:[320*10+11],12 mov byte ptr es:[320*10+12],12 mov byte ptr es:[320*11+10],12 mov byte ptr es:[320*11+11],12 mov byte ptr es:[320*11+12],12 mov byte ptr es:[320*12+10],12 mov byte ptr es:[320*12+11],12 mov byte ptr es:[320*12+12],12 {Рисуем - два} mov byte ptr es:[320*100+100],1 mov byte ptr es:[320*101+101],2 mov byte ptr es:[320*102+102],3 mov byte ptr es:[320*103+103],4 mov byte ptr es:[320*104+104],5 mov byte ptr es:[320*105+105],6 end; {Ожидаем нажатия клавиши} asm mov ah,0 int 16h end; {Устанавливаем текстовый режим монитора 03h, 80x25, 16 цветов текста и фона} asm mov ax,0003h int 10h end; end. Ага. Теперь скомпиллируйте ЭТО и запустите на выполнение. Что Вы видите ? (Должны увидеть квадратик и цепочку точек). Нажав клавишу, Вы должны закрыть графическое окно и вернуться в среду. НЕбольшое техническое отступление. Синтаксис асм-вставок в tp7. Асм-вставка начианется псевдооператором "asm". Далее идут сами ассемблерные команды(Вы должны видеть их зелеными). Завешает блок асм директива "end;" - как, врочем, и другие логически завершенные блоки в Pascal. Теперь посмотрим на команды. Их не так много и они довольно одинаковы. Отбросим пока вот эти три блока, дав им поверхностное объяснение: asm mov ax,0013h int 10h end; Пока примите, как факт, что для вызова Операционной системы, BIOS или других программ обычно используются вот такие вот записи(команды): mov ax,0013h - это пример ЗАДАНИЯ ПАРАМЕТРОВ, передаваемых другим программам; int 10h - это ВЫЗОВ других программ Вашей машины - здесь это вызов BIOS. {Ожидаем нажатия клавиши} asm mov ah,0 int 16h end; mov ah,0 - это пример ЗАДАНИЯ ПАРАМЕТРОВ, передаваемых другим программам; int 16h - это ВЫЗОВ других программ Вашей машины - здесь это вызов BIOS. Итак, вернемся к тем командам, которые откомментарены как " {Рисуем - раз}" и "{Рисуем - два}". Попытайтесь понять, чем они похожи, а чем отличаются... ... Вы должны были заметить, что вот эти команды: mov byte ptr es:[320*10+10],12 mov byte ptr es:[320*10+11],12 ... в более общем виде можно записать как: mov byte ptr es:[Что-то],Еще что-то. Попробуйте самостоятельно поменять эти "Что-то" и "Еще что-то" у нескольких команд. Посмотрите на результат. Создайте еще несколько подобных команд. Проявите фантазию в разумных пределах и насоздавайте еще разных подобных команд. Попытайтесь сделать самостоятельно какие-то обобщения по результатам. А теперь небольшое задание. Исходный пример рисовал нам красный квадратик в верхнем левом углу экрана. Попробуйте на основе полученного опыта ТОЛЬКО с помощью команд типа: mov byte ptr es:[Что-то],Еще что-то. нарисовать синий прямоугольник, но уже в нижнем правом углу экрана. Подсказка: обратите внимание вот на этот комментарий: {Устанавливаем графический режим монитора 13h, 320x200, 256 цветов} Урок 1 закончен. Решение и некоторые объяснения будут даны в уроке 2. Да пребудет с Вами Великая Сила ! -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Урок 2. Основные понятия. Микропроцессор 8086. Решение примера Урока 1
на основе полученных знаний. Косвенная адресация: первый пример. Итак, начнем этот урок с очень важной штуки. Введем основные определения, которых будет немного, они будут просты... но это будут самые важные понятия во всем этом деле ! Итак, чего вообще мы хотим ? Мы хотим научиться разговаривать с Машиной на ее языке. Поэтому дадим понятие КОМПЬЮТЕРА(Машины), именно так, как она будет выглядеть для Вас при программировании на ассемблере: МАШИНА - нечто, состоящие из ПРОЦЕССОРА, ОПЕРАТИВНОЙ ПАМЯТИ и ПОРТОВ ВВОДА-ВЫВОДА. ПРОЦЕССОР умеет выполнять ПРОГРАММЫ. Раскроем детальнее эти понятия: - ОПЕРАТИВНАЯ ПАМЯТЬ: набор ячеек, в котрые можно записывать числа и из которых можно читать числа. - ПОРТЫ ВВОДА-ВЫВОДА: набор ячеек, в котрые можно записывать числа и из которых можно читать числа. - ПРОЦЕССОР: функция, понимающая и реализующая числа, записанные в ОПЕРАТИВНОЙ ПАМЯТИ как действия (КОМАНДЫ). Выполнение команд назовем ПРОГРАММОЙ. Итак, это важно !!! - нет никаких жестких дисков, джойстиков, мышей ... Есть только ПРОЦЕССОР, ОПЕРАТИВНАЯ ПАМЯТЬ и ПОРТЫ ВВОДА-ВЫВОДА. Любое наше действие будет направлено ТОЛЬКО на работу с этими тремя объектами. Итак, мы определились: есть ОПЕРАТИВНАЯ ПАМЯТЬ, в ней храняться числа, ПРОЦЕССОР обрабатывает эти числа и выполняет действия, заданные этими числами. Очевидно из данных нами определений, что эти действия(КОМАНДЫ) в любом случае могут быть направлены ТОЛЬКО на измение(чтение/запись) ОПЕРАТИВНОЙ ПАМЯТИ и (или) ПОРТОВ ВВОДА-ВЫВОДА, либо на изменение состояния самого ПРОЦЕССОРА. В общем виде КОМАНДУ можно представить в таком виде: Что_Делать:<Как Делать>. Как_Делать может быть пропущенно(<...>), ибо Что_Делать: ничего не делать не требует дополнительных сведений. Да, есть такая команда - Ничего_Не_Делать. Пример из жизни: команда "Лежать" также не требует дополнительных данных. Таким образом, процессор читает ОПЕРАТИНВУЮ ПАМЯТЬ и трактует прочитанные числа как команды. Поняв команду, он выполняет заданные в ней действия. Команды, как уже было сказано, могут сводится к одному или нескольким из следующих действий: - Ничего не делать; - Изменить что-то в ОПЕРАТИВНОЙ ПАМЯТИ; - Изменить что-то ПОРТАХ; - Изменить состояние процессора. Что значит "Изменить что-то в оперативной памяти" ? Это означает изменить те числа, которые в ней находятся: прочесть их или записать новое значение числа. То же самое и с портами ввода-вывода. Что означает "Изменить состояние процессора" ? Это означает повлиять на то, как он будет трактовать(исполнять, выполнять) КОМАНДЫ. Вернемся к второй части КОМНАДЫ - "Как Делать". Очевидно, что в ней должно содержаться указание на область ОПЕРАТИВНОЙ ПАМЯТИ, если мы хотим ее читать/записывать, либо указание на область ПОРТОВ, если мы хотим читать/записывать в них. Поэтому введем понятие ЭФФЕКТИВНОГО АДРЕСА - указатель на конкретный элемент памяти, портов или процессора. Теперь хватит теории, перейдем к практике. Мы работали в Уроке 1 и будем работать в ближайшее время с конкретным процессором - 8086 фирмы Intel, выпущенным еще в конце 70-х годов. Процессор этот выполняет команды, записанные в опеределенного вида памяти, и может, выполняя команды, изменять определенного вида порты ввода-вывода. Память эта также есть набор ячеек, в которые можно записывать числа. Каждая ячейка может хранить числа от 0 до 255. Порты также являются ячейками, в которые можно записывать /из которых можно читать числа от 0 до 255. Как храняться числа в этих ячейках ? Каждая из них состоит из 8 так называемых бит. Бит - это нечто, могущее быть только в двух состояниях - 0/1(Да/Нет,Триггер ... - как Вам нравиться). Вспомним, что любое целое и неотрицательное число (0,1,2..10000...) можно разложить по степеням двойки: 25 = 16+8+1 = 1*2^4 + 1*2^3 + 0*2^2 + 0*2^1 + 1*2^0 = 1*16+1*8+0*4+0*2+1*1. Итак, если мы будем трактовать 8 бит каждой такой ячейки, называемой байтом, как коэффициенты при степени двойки, то получим возможность раскладывать числа по 8-ми различным степеням: 2^7,2^6... 2^0. Иначе говоря, каждое число в каждой ячейке оперативной памяти 8086 реализовано определенным состоянием всех восьми бит этой ячейки: Число: 25 65 128 255 Бит0 1 1 0 1 Бит1 0 0 0 1 Бит2 0 0 0 1 Бит3 1 0 0 1 Бит4 1 0 0 1 Бит5 0 0 0 1 Бит6 0 1 0 1 Бит7 0 0 1 1. Каждая такая ячейка называется байтом. Итак, в 8086 записываются числа в оперативную память. Процессор может читать эти числа, трактовать их как команды, понимать из команды, какую ячейку памяти ему нужно изменять. Как же он это делает ? Очевидно, что ему надо знать ЭФФЕКТИВНЫЙ АДРЕС команды, ЭФФЕКТИВНЫЙ АДРЕС ячейки, которую указано поменять в ПАМЯТИ или ПОРТАХ. По большому счету, ЭФФЕКТИВНЫЙ АДРЕС - это номер ячейки(номер байта) в памяти или портах. Нумерация от нуля. Например, байт(ячейка) номер 20 содержит значение 22. Как же процессор формирует этот ЭФФЕКТИВНЫЙ АДРЕС ? (Иными словами, где хранится и как вычисляется номер байта) ? Как ни странно, но он делает это весьма замысловатым образом: в процессоре имеются так называемые РЕГИСТРЫ - это тоже ячейки "памяти" самого процессора, но размером в СЛОВО(два байта). Можно сказать, что у Процессора есть своя небольшая память, состоящая из набора слов. Если байт - это ячейка из восьми бит, то слово содержит целых 16 бит, и в него можно записывать числа от 0 до 65535(посмотрите, как хранятся числа в ячейках-байтах и поймите, какие числа можно хранить в ячейках из 16 бит). Имея около десятка таких ячеек-слов, процессор использует некоторые из них для вычисления ЭФФЕКТИВНОГО АДРЕСА. Вы можете подумать, что номер ячейки памяти, содержащую текущую выполняемую команду, просто храниться в одном из РЕГИСТРОВ, а после выполнения текущей команды в него заносится номер следующей команды: Команда1 Байт1, Байт2,Байт3 команды 1. Номер ячейки - 230 (Номер байта1). Регистр_Текущей_Команды равен 230. После выполнения команды1 процессор начнет выполнять команду2: Команда2 Байт1, Байт2 команды 2. Номер ячейки - 233 (Номер байта1). Регистр_Текущей_Команды равен 233 ? В какой-то мере у процессора 8086 это так, но в точности - не так ! Скажем вот что: процессор 8086 может работать с памятью размером в один Мегабайт(примерно миллон ячеек по одному байту). Команды или какие-то вспомогательные числа могут быть размещены в любой ячейке с номером от 0 до ~1 миллиона. Т.е. номер текущей выполняемой команды может быть в этом диапазоне. Процессор может использовать для хранения этого номера один или несколько из своих регистров размером в слово. Вот эти регистры, которые есть у него(все они размером в слово): Сокращенное имя/Полное имя IP - Instruction Pointer; CS - Register of Code Segment; SS - Register of Stack Segment; SP - Stack Pointer; ES - Register of Extra Segment; DS - Register of Data Segment; AX - Accumulator; BX - Base Register; CX - Counter DX - Data Register; SI - Source Register; DI - Destination Register; BP - Base Pointer; FLAGS - Flags Register. Итак, имеем этот набор регистров. Каждый размером в слово. Не обращайте пока внимание на их названия. Прикинте, как процессор хранит номера ячеек памяти в них. Вы могли догадаться, что для хранения номера ячейки недостаточно любого одного регистра из-за того, что размер памяти 8086 = 1 миллион > максимальное число, которое можно хранит в одном слове - 65535. Два будет абсолютно достаточно, ибо число ~один миллион легко раскладывается по степеням двойки вплоть до 20 степени, а, значит, нам достаточно иметь всего 20 бит для его хранения ... А два регистра обладают уже 32 битами. Например, можно придумать такую схему размещения номера байта(ЭФФЕКТИВНОГО АДРЕСА) в двух регистрах: 1-ый регистр - 16 младших(первых) битов числа ЭФФЕКТИВНОГО АДРЕСА; 2-ой регистр - 4 старших(вторая часть) битов. Но это не так !!! Вот что делает этот хитрый процессор: он использует действительно два регистра, но значение одного из них он умножает на 16 и к полученному значению прибавляет значение из другого регистра или самой команды непосредственно: ЭФФЕКТИВНЫЙ АДРЕС = Регистр1 x 16 + Регистр 2(или непосредственное значение). Возьмем команду из Урока 1: mov byte ptr es:[320*10+10],12 Эта команда предназначена для того, чтобы записать в ячейку памяти номер 658570 числа 12. Смотрите, что в этой команде задано: Что_Делать: Записать число в память. Как Делать: Число взять из самой команды - 12; Адрес памяти вычислить, используя регистр es и непосредственное значение, указанное в команде - 320*10+10; Размер применика(числа в памяти для записи) - один байт. Сейчас обратим внимание ТОЛЬКО на то, как 8086 ухитрился вычислить адрес ячейки памяти из этой команды. Смотрите: Регистр1 = Регистр ES(в команде так и задано) Непосредственное значение для прибавки = 320*10+10 (тоже задано в команде) ЭФФЕКТИВНЫЙ АДРЕС = ES x 16 + 320*10+10 = 658570. Кто же задал значение регистра ES Ясно дело, что мы ! Мы контролируем весь процесс выполнения программы процессором ! А как мы это сделали ? А вот как: mov ax,0A000h mov es,ax Мы тут задали значение регистра ES - 0A000h = 40960. Теперь Вы понимаете, что меняя "Что-то" в командах Урока1: mov byte ptr es:[Что-то],Еще что-то вы меняли Адрес Ячейки Памяти ! А вот решение задания: mov byte ptr es:[320*160+110],9 mov byte ptr es:[320*160+111],9 mov byte ptr es:[320*160+112],9 mov byte ptr es:[320*161+110],9 mov byte ptr es:[320*161+111],9 mov byte ptr es:[320*161+112],9 mov byte ptr es:[320*162+110],9 mov byte ptr es:[320*162+111],9 mov byte ptr es:[320*162+112],9 - синий квадратик. Сейчас у Вас должно возникнуть еще больше вопросов, нежели после первого урока !!! Но и должно появиться смутное ощущение ПАМЯТИ, которой Вы можете управлять такими вот командами. А теперь - на закуску - Косвенная адресация !!! Уже было сказано, как 8086 может вычислять адрес в памяти: ЭФФЕКТИВНЫЙ АДРЕС = Регистр1 x 16 + Регистр 2(или непосредственное значение). Только что мы видели, как он использует непосредственное значение, взятое из команды. А теперь поглядите, как можно заставить процессор использовать второй вариант - через использование двух регистров: mov bx,320*180+100 {Заносим значение(число) 320*180+100 в регистр BX} mov byte ptr es:[bx],2 {Изменим память, используя ДВА регистра для адресации} В последней команде эффективный адрес будет вычислен так: ЭФФЕКТИВНЫЙ АДРЕС = ES x 16 + BX. Теперь попробуйте использовать для рисования комнады, использующие такой способ адресации, например: {Рисуем - три !!!} asm mov bx,320*180+100 {Заносим значение(число) 320*180+100 в регистр BX} mov byte ptr es:[bx],2 {Изменим память, используя ДВА регистра для адресации} mov bx,320*180+101 {Заносим значение(число) 320*180+101 в регистр BX} mov byte ptr es:[bx],2 {Изменим память, используя ДВА регистра для адресации} mov bx,320*180+102 {Заносим значение(число) 320*180+102 в регистр BX} mov byte ptr es:[bx],2 {Изменим память, используя ДВА регистра для адресации} end; Если Вы выполните этот код, то должны увидеть маленькую зеленую полоску внизу и посередине экрана. Задание: попробуйте сделать эту полоску потолще и подлиннее, но используя именно такие команды - mov byte ptr es:[bx]. Попытайтесь вместо таких команд использовать уже известные Вам - типа mov byte ptr es:[320*180+100],2. Урок 2 закончен. Некотрые объяснения будут даны в уроке 3, но вопросов должно быть немеряно !!! Да пребудет с Вами Великая Сила ! -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
AXEL3323 |
|
|||
Unregistered |
Привет!! Уроки - просто супер! Вот у меня вопрос
В пакете Tasm в отладчике td.exe для отладки существует много способов (пошаговые, бреакпоинтовский и т.д.), для краткости это F4,F7,F8, ну и F9. Так вот чтобы прервать выполнение программы надо нажать сочетание Ctrl+F2 ( Program Reset). НО в режиме отладки F9 программа не останавливается . Так надо??..Что-то я не пойму... А отладчик версии 5.0 ( от 21.02.96), я его взял с нового диска , хотя с тех пор он и не менялся....(ну я имею ввиду 16-разрядный из TASM'а) Так как мне прервать выполнение программы?(из режима RUN) |
|||
|
||||
neutrino |
|
|||
Gothic soul Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
Tut mnogo, kto hochet asm uchit. Mojet Chingachguku otdelnuiu formu sdelat? S temami ... Ia bi, naprimer, zahjodil. I primeri interesnie daet. Mojet knigu vipustit "Assembler Chingachguka". Vot eto tochno ne lamievo!
-------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
Chingachguk |
|
||||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Из режима RUN можно использовать CTRL_BREAK. Но ! Если, к примеру, в программе написать замкнутный цикл: @@Label: jmp @@Label То нажатие этих клавиш не всегда прервет программу внутри этого кода Потому, что еще выполняются прерывания ... Отладчик может остановить работу программы двумя способами: установить свой обработчик на клавиатуру(это и есть CTRL_BREAK), но бывает код, вырубающий прерывания/маскирующий прерывания от клавиатуры, а также установить брейкпойнты (это и есть F4...). Видимо, ты пытаешься отладить программу, которая, к примеру, где-то виснет и ты хочешь, нажав CTRL_F2, ее скинуть, узнав где она зависла ? Рекомендую действовать методом приближения к "багу": устанавливаешь брейки и постепенно доходишь до неверного кода.
Хе, да я в жизни ничего подобного не делал, у меня даже своей странички нету Хотя, может быть, дойдут руки... К тому же я счас помогаю развивать вот этот сайт http://hi-tech.nsys.by/ - он целиком по асму. -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||
|
|||||
neutrino |
|
|||
Gothic soul Профиль Группа: Модератор Сообщений: 3041 Регистрация: 25.3.2002 Где: Верхняя Галилея, Кармиэль Репутация: нет Всего: 62 |
Da, sait nichego, osobenno fanariki na solnechnih batareikah ponravilis. No dolgo gruzitsia.
-------------------- The truth comes from within ... Покойся с миром, Vit |
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Урок 3. Продолжаем работать с памятью. Первый цикл. Изучение
двухкомпонетного адреса. Упс, как говорит Б.Спирс, ай дид ит эгейн. Ну и мы тоже эгейн. В смысле, снова поработаем с памятью. Итак, память. Памяти у нас примерно миллион ячеек по 1 байту. Где-то находятся байты нашей программы, которую процессор сейчас читает байт за байтом и выполняет, где-то байты программ БИОС-а, где-то - ДОС-а. Ну а начиная с байта нумер 655360 находится так называемый видеобуфер. Можно сказать по-другому - с номера A0000h. Это - шестнадцетеричная система исчисления. Эти числа равны: 655360=A0000h, просто они записаны по-разному. Здесь мы не будем подробно разбирать эту систему, приведем только пример преобразования числа A0000h в "нормальный" вид: A0000h = A*16^4+0*16^3+0*16^2+0*16^1+0*16^0 = 10*16^4 = 655360. h - просто обозначение такой системы исчисления; A = 10, B = 11, C = 12, D = 13, E = 14, F = 15 - поскольку основанием является 16, то для записи числа НЕ ХВАТАЕТ чисел "привычной" десятичной системы - 0,1,2,3..9. Вы вполне можете обойтись виндовым или любым другим калькулятором для такого рода преобразований. Ага, так что же такое видеобуфер ? Он же - видеопамять, видеокарта, ... Для нас нет никаких железок, джемперов, жестких дисков, повторяю ! Есть только память, порты и процессор. Видеобуфер для нас в данном случае - просто КУСОК ПАМЯТИ. Начинается с байта номер A0000h. Почему же мы выделяем этот кусок особо ? А вот почему: помните, у нас в Уроке 1 был такой код: {Устанавливаем графический режим монитора 13h, 320x200, 256 цветов} asm mov ax,0013h int 10h end; Всего две команды, а делают сколько ! После их выполнения БИОС сделает так, что всякая запись чисел в этот видеобуфер приведет к изменениям на мониторе ! Как это происходит ? С нашей стороны "забора" мы пишем в ячейки этого куска памяти числа. Они там и остаются, пока их не изменить. С другой стороны "забора" сидит аппаратура, "железо", как ее еще называют, которая СОВЕРШЕННО НЕЗАВИСИМО от выполнения наших программ начинает трактовать эти числа КАК ЦВЕТА ТОЧЕК монитора. Это ее БИОС так заставил делать. Переключил в такой режим. Бывают и другие режимы работы видеокарты-видеоаппаратуры - текстовые там, графические ... Мы в графическом. Но это все нам неважно. Важно нам только то, как надо писать в эту память числа, чтобы аппаратура эта нарисовала на их основе изображение на мониторе. Более детально. Вспомним, что режим у нас - 320x200, 256 цветов. 320 точек по горизонтали, 200 - по вертикали. Каждая точка может иметь 256 различных цветов. 1 байт памяти как раз может иметь 256 различных состояний. Число в байте номер A0000h аппаратура трактует как цвет верхнего левого пикселя, число в следующем байте - как цвет следующего(двигаясь направо) пикселя и так далее. На одну строчку 320 пикселей - значит, и в памяти 320 байт. 321 байт начиная с байта A0000h - это уже самый левый пиксель второй стороки и так далее: Номер пикселя по горизонтали/вертикали - номер байта в памяти 0 1 2 3 0 A0000h A0000h+1 A0000h+2 A0000h+3 ... 1 A0000h+320... 2 ... Ага. Нетрудно сообразить, что для всех 320x200 точек монитора требуется 320x200 = 64000 байт памяти. Например, запись в байт с номером A0000h+320x200-1 приведет к изменению цвета нижнего правого пикселя. Проверим это. Нарисуем вертикальную горизонтальную линию на мониторе, желтого цвета, по самой первой строке от левого до правого края монитора. От уха до уха, так сказать. Для этого мы должны записать число 14(желтый цвет) в байты с номерами A0000h,A0000h+1... A0000h+319 - всего 320 последовательных байт. Вспоминаем, как процессор может делать это: mov ax,0A000h {Заносим в регистр AX число 0A000h} mov es,ax {Копируем число из регистра AX в регистр ES, фактически - 0A000h} mov byte ptr es:[0],14 {Записываем по адресу 0A000hx16+0 байт значением 14} mov byte ptr es:[1],14 {Записываем по адресу 0A000hx16+1 байт значением 14} mov byte ptr es:[2],14 {Записываем по адресу 0A000hx16+2 байт значением 14} ... Не надоело ? Верно, надо делать цикл. Как и в других языках программирования, в асме тоже есть циклы. Что же за цикл нам нужен ? Цикл из 320 повторений, в цикле должен вертеться индекс, позволяющий нам записывать СМЕЩЕНИЕ адреса в команде от 0 до 319. СМЕЩЕНИЕ - это та часть эффективного адреса, который процессор вычисляет из команды и добавит его к СЕГМЕНТНОМУ регистру, умноженному на 16: mov byte ptr es:[1],14 Эффективный адрес = es * 16 + 1 СЕГМЕНТНАЯ ЧАСТЬ СМЕЩЕНИЕ. В этой команде смещение указано явно. Жестко. Сколько бы раз мы не выполнили эту команду, она запишет байт 14 в одну и ту же ячейку памяти. Если только не менять значение сегментного регистра es. Почему бы нам не поменять его ? А вот, например, почему: нетрудно заметить, что ЛЮБОЕ значение в сегментном регистре es при смещении = 1 нам НИКОГДА не позволит писать в ячеку памяти номер A0000h(подумайте, почему !. Теперь вспомним, что в Уроке 2 мы проходили так называемую КОСВЕННУЮ адресацию: mov bx,1 mov byte ptr es:[bx],14 {Записываем по адресу 0A000hx16+bx байт значением 14}. Процессор использовал для получения смещения регистр ! А регистры мы можем менять ! Тогда начнем писать цикл: mov ax,0A000h {Заносим в регистр AX число 0A000h} mov es,ax {Копируем число из регистра AX в регистр ES, фактически - 0A000h} mov bx,0 {Смещение первой точки равно 0} mov byte ptr es:[bx],14 ADD bx,1 {Добавить к регистру BX 1 !} Вот, новая команда(ADD) ! До сих пор мы работали с одной командой засылки значения - mov(от move, англ.). А команда "ADD" (addition, сложить) позволяет добавлять к приемнику операции (здесь - регистр BX) значение источника - "1". И регистр BX станет равен 1 ! Что же дальше ? Последуем классическому типу циклов: repeat {Тело цикла} Until {Условие=TRUE} Очевидно, что телом цикла у нас выступает команда закраски - mov byte ptr es:[bx],14. Командой add bx,1 мы изменили регистр BX и можем анализировать его состояние (Условие=TRUE). Что же мы будем анализировать ? Если мы хотим задать смещение от 0 до 319, то нам годятся все значения bx в этом диапазоне, иначе цикл надо прерывать. Делаем это: add bx,1 {inc(BX) или BX:=BX+1 или BX++} CMP bx,319 {Сравнить BX и 319} JBE МЕТКА_НАЧАЛА_ЦИКЛА - @repeat. Опять, опять новые команды ! Не бойтесь, их вообще не так много, а выучить их проще простого ! Я обязательно далее раскажу подробно о командах, а пока лишь вкратце: CMP bx,319 {COMPARE BX WITH 319} JBE @repeat {JUMP IF BELOW OR EQUAL} Вы видите расшифровку сокращений этих команд. CMP-это сравнение. BX с 319. По результатам этого сравнения мы можем писать команды переходов. А фактически - приказать процессору перейти на конкретную команду, да еще и в зависимости от результата сравнения - JBE. А вот как выглядит весь код: begin {Устанавливаем графический режим монитора 13h, 320x200, 256 цветов} asm mov ax,0013h int 10h end; asm {Кусок рисования} mov ax,0A000h mov es,ax mov bx,0 @Repeat: mov byte ptr es:[bx],14 add bx,1 cmp bx,319 jbe @Repeat {Кусок рисования - Закончен} end; {Ожидаем нажатия клавиши} asm mov ah,0 int 16h end; {Устанавливаем текстовый режим монитора 03h, 80x25, 16 цветов текста и фона} asm mov ax,0003h int 10h end; end. Примечание ! Обратите внимание, что я выделил комментарием содержательную часть кода, назвав его "Кусок рисования". Далее я не буду приводить весь текст этой небольшой программы, Вам досточно будет заменить только код, названный "Кусок рисования". Остальные команды нам пока непонятны и не будут меняться ближайшее время. Выполните этот код. Убедитесь в наличии желтой полосы вверху экрана. Метка начала цикла у нас называется @Repeat. Почему вначале @ ? Это особенность asm-вставок языка Паскаль. В настоящем ассемблере Вы можете извращаться так, как вам хочется, хотя это ограничение не слишком сильное. Вы могли назвать метку @MY_LABEL. Важно одно: Вы сравнили командой CMP регистр BX с 319, и, если его значение МЕНЬШЕ(BELOW) или(OR) равно(EQUAL) 319, то передаете управление на эту метку. Примечание: Вам должно быть непонятно, ОТКУДА команда JBE знает про результаты выполнения команды сравнения (CMP). Усложним слегка пример. Хочу, чтобы мы нарисовали желтую полосу не по первой сверху строке, а по строке номер 160 ! Думаю, Вам понятно, где начинаются байты, отвечающие этой строке: Номер пикселя по горизонтали/вертикали - номер байта в памяти 0 1 2 160 A0000h+160*320 A0000h+160*320+1 A0000h+160*320+2... А это означает, что начальное смещение в цикле надо задать просто не с нуля, а с 160*320: {Кусок рисования} mov ax,0A000h mov es,ax mov bx,160*320 {Начальное смещение !} @Repeat: mov byte ptr es:[bx],14 add bx,1 cmp bx,160*320+319 {Внимание ! Мы изменили и эту команду !} jbe @Repeat {Кусок рисования - Закончен} Воткните этот кусок вместо прежнего и выполните программу. Убедитесь, что все хоккей - желтая полоса посреди экрана. Важный момент: cmp bx,160*320+319 {Внимание ! Мы изменили и эту команду !} У нас регистр BX уже меняется не от нуля ! И закончим мы рисовать не тогда, когда он станет 320, а когда 160*320+320 ! А теперь еще навороченне !!! Мы можем задавать эффективный адрес, варьируя две компоненты: сегмент и смещение. Только что мы сместили полосу на экране, меняя смещение. Это было естественно, поскольку мы занесли в регистр es такое число, что процессор, умножая его на 16, как раз втыкался в начало видеобуфера: es * 16 = 0A000h * 16 = 0A0000h ! И нам было наглядно задавть смещение от нуля(словно индексация в массиве). Но мы попробуем устроить себе трабл и использовать другое (не 0A000h) значение, заносимое в сегментный регистр es, чтобы нарисовать ту же желтую линию в 160 строке. Нам надо задавть в командах такие вот адреса: Номер пикселя по горизонтали/вертикали - номер байта в памяти 0 1 2 160 A0000h+160*320 A0000h+160*320+1 A0000h+160*320+2... A0000h бралось ранее из es. Смещения - 160*320+0,1,2.. - из bx. А можно ли задать так значение es, чтобы смещение, к примеру, начиналось с 0 ? Вот так: 0 1 2 160 X+0h X+1 X+2... - ? Здесь X - это неизвестное. Оно должно быть получено процессором так: X = es*16 А ячейки памяти должны иметь одинаковые адреса: X+0h = A0000h+160*320. Решая это несложное уравнение, найдем, что X = AC800h = 706560. Значит, es = AC800h / 16 = AC80h ! И измененный код готов: {Кусок рисования} mov ax,0AC80h mov es,ax mov bx,0 {Начальное смещение ! - опять нуль !} @Repeat: mov byte ptr es:[bx],14 add bx,1 cmp bx,319 {Внимание ! Мы изменили и эту команду ! - вернули !} jbe @Repeat {Кусок рисования - Закончен} Заделаем этот пример понагляднее ! Сначала нарисуем желтую полосу в строке 160 "обычным" способом - занося перед циклом в регистр es число 0A000h, а потом нарисуем поверх желтой полосы фиолетовую, но уже занося в es значение 0AC80h ! Вот кодец: {Кусок рисования} mov ax,0A000h mov es,ax mov bx,160*320 {Начальное смещение !} @RepeatYellow: mov byte ptr es:[bx],14 add bx,1 cmp bx,160*320+319 jbe @RepeatYellow {Остановим программу известным нам способом} mov ah,0 int 16h {Рисуем, но уже другим способом !} mov ax,0AC80h mov es,ax mov bx,0 {Начальное смещение ! - опять нуль !} @RepeatMagneta: mov byte ptr es:[bx],13 {Цвет не желтый !} add bx,1 cmp bx,319 jbe @RepeatMagneta {Кусок рисования - Закончен} Проверьте этот код ! Ну вот. А теперь я хочу, чтобы Вы выполнили два небольших заданьица: 1) Заполнить ВЕСЬ экран каким-нибудь цветом. Желательно - красным. 2) Нарисовать горизонтальную полосу зеленого цвета в 64 строке экрана: - занеся в регистр es адрес начала видеобуфера; - занеся в регистр es такое значение, чтобы рисовалась та же полоса в 64 строке экрана, Но вот смещение Вы бы задавали с нуля ! Не возбраняется, а приветствуется появление Ваших решений до выкладки Урока 4, где они будут приведены ! Будет неплохо поглядеть на Ваш код и сделать обсуждам ! Урок 3 закончен. Да пребудет с Вами Великая Сила ! -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
Melancholy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 1.4.2002 Репутация: нет Всего: нет |
прога заполняет весь экран красным цветом.
begin {Устанавливаем графический режим монитора 13h, 320x200, 256 цветов} asm mov ax, 00013h int 010h end; asm {Кусок рисования} mov ax, 0A000h mov es, ax xor di, di {обнуляем регистр di} mov al, 004h mov cx, 64000 {счетчик = 64000 = 320 * 200} rep stosb {выполняем 64000 раз команду stosb} {stosb - помещает значение регистра al в ячейку памяти es:di} {Кусок рисования - Закончен} end; {Ожидаем нажатия клавиши} asm mov ah,0 int 16h end; {Устанавливаем текстовый режим монитора 03h, 80x25, 16 цветов текста и фона} asm mov ax,0003h int 10h end; end. а как тебе такой код? |
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Неплохо ! ж) Видимо, ты знаешь ассемблер на каком-то уровне ! Всего одна ошибка: пропустил команду "cld" Но код почти на 100% работает ! Правда, в уроке подразумевалось более "незамысловатое" решение. А как насчет второго задания ? -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
Melancholy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 1.4.2002 Репутация: нет Всего: нет |
Вариант 1
begin {Устанавливаем графический режим монитора 13h, 320x200, 256 цветов} asm mov ax, 00013h int 010h end; asm {Кусок рисования} mov ax, 0A000h mov es, ax mov di, 320*64 mov al, 004h mov cx, 320 cld {между прочим вероятность, что флажек CF установлен очень мола!!!} rep stosb {выполняем 64000 раз команду stosb} {Кусок рисования - Закончен} end; {Ожидаем нажатия клавиши} asm mov ah,0 int 16h end; {Устанавливаем текстовый режим монитора 03h, 80x25, 16 цветов текста и фона} asm mov ax,0003h int 10h end; end. Вариант 2 begin {Устанавливаем графический режим монитора 13h, 320x200, 256 цветов} asm mov ax, 00013h int 010h end; asm {Кусок рисования} mov ax, 0A000h + 20*64 mov es, ax xor di, di mov al, 004h mov cx, 320 cld rep stosb {выполняем 64000 раз команду stosb} {Кусок рисования - Закончен} end; {Ожидаем нажатия клавиши} asm mov ah,0 int 16h end; {Устанавливаем текстовый режим монитора 03h, 80x25, 16 цветов текста и фона} asm mov ax,0003h int 10h end; end. P.S. Что ты имеешь введу "почти на 100% работает"? |
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Ну что ж, все верно !
А под этими "почти 100%" я и имел в виду флажок направления. Думаю, хоть вероятность и мала, но все-таки есть ЗЫ А еще кто-нибудь сможет решить ? -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
Alex101 |
|
|||
Опытный Профиль Группа: Участник Клуба Сообщений: 891 Регистрация: 8.4.2002 Где: Москва Репутация: нет Всего: 10 |
У меня есть старые наработки на асме - графические процедуры для разных режимов... Может кинуть сюда кое-что? Там и работа с портами... -------------------- С уважением, А. Фролов. |
|||
|
||||
Melancholy |
|
|||
Новичок Профиль Группа: Участник Сообщений: 43 Регистрация: 1.4.2002 Репутация: нет Всего: нет |
||||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
>Alex101 Написано: 28.5.2002,22:34
>Цитата (Chingachguk @ 08.4.2002,176) >>ЗЫ А еще кто-нибудь сможет решить ? >У меня есть старые наработки на асме - графические процедуры >для разных режимов... >Может кинуть сюда кое-что? Там и работа с портами... Вообще я пытался уроки написать ... До портов не дошло дело Графика тут постольку поскольку - я ж не демки рисовать ... Так что кидай рядом, видимо ! Тему создавай ! Или мне на мыл тоже Может, и я в тему допишу И народ ! -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
PoluBOG |
|
|||
Новичок Профиль Группа: Участник Сообщений: 19 Регистрация: 24.5.2002 Репутация: нет Всего: нет |
Ето круто, а как енту прогу в чистом асме оформить?
begin {Устанавливаем графический режим монитора 13h, 320x200, 256 цветов} asm mov ax, 00013h int 010h end; asm {Кусок рисования} mov ax, 0A000h mov es, ax mov di, 320*64 mov al, 004h mov cx, 320 cld {между прочим вероятность, что флажек CF установлен очень мола!!!} rep stosb {выполняем 64000 раз команду stosb} {Кусок рисования - Закончен} end; {Ожидаем нажатия клавиши} asm mov ah,0 int 16h end; {Устанавливаем текстовый режим монитора 03h, 80x25, 16 цветов текста и фона} asm mov ax,0003h int 10h end; end. Вариант 2 begin {Устанавливаем графический режим монитора 13h, 320x200, 256 цветов} asm mov ax, 00013h int 010h end; asm {Кусок рисования} mov ax, 0A000h + 20*64 mov es, ax xor di, di mov al, 004h mov cx, 320 cld rep stosb {выполняем 64000 раз команду stosb} {Кусок рисования - Закончен} end; {Ожидаем нажатия клавиши} asm mov ah,0 int 16h end; {Устанавливаем текстовый режим монитора 03h, 80x25, 16 цветов текста и фона} asm mov ax,0003h int 10h end; end. |
|||
|
||||
Заходяга |
|
|||
Unregistered |
Искал я на поисковиках строку "Том Сван" - не находит. Может подскажешь где найти |
|||
|
||||
end1 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 2 Регистрация: 30.6.2002 Репутация: нет Всего: нет |
Chingachgukу пора писать книгу.Однозначно.
|
|||
|
||||
Baa |
|
|||
Эксперт Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: нет Всего: 12 |
-------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
Edmond |
|
|||
Unregistered |
||||
|
||||
Baa |
|
|||
Эксперт Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: нет Всего: 12 |
Wasm оно ток недавно...эт 2 сайта слили...а он давно статьи писал на дZене
-------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
Jon |
|
|||
Unregistered |
напиши по подробнее для чего нужна команда int
|
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Как правило, в системе существуют одновременно кроме программы пользователя различные системные программы и обработчики прерывания.
Разумеется, это необязательно - можно писать самодостаточные программы, совершенно ни в ком не нуждающиеся. Однако как правило программа запускается ОС и часто вызывает сервисы ОС. В свою очередь ОС вызывает программы БИОС(дос-семейства) или собственные обработчики (WinNT, Unix) или и те и другие (Win98) прерываний для доступа к устройствам (дискам, звуковой карте и проч.). Как организовать вызовы таких обработчиков ? Ставим задачу: пусть выполняется программа пользователя и существуют аппаратные прерывания от таймера. При возникновении прерывания процессор (он не может выполнять одновременно несколько программ) должен "временно отложить" выполнение программы пользователя, выполнить некую "программу обработки события прерывания от таймера" и вернуться к выполнению основной программы; при этом он должен: - обеспечить "прозрачность" работы программы-обработчика относительно программы пользователя, т.е. не нарушить работу основной программы; - уметь вернуть управление пользовательской программе без разрушения оной. - Знать, где находится программа-обработчик прерывания. Начнем с конца. В процессоре 8086 для конкретизации места обработчиков прерываний в памяти в памяти начиная с адреса 0 расположена ТАБЛИЦА АДРЕСОВ обработчиков прерываний. Каждый адрес дальний (far), он состоит из сегмента обработчика и его смещения в этом сегменте. В таблице 256 элементов. Размер каждого адреса 4 байта: seg:offset. Заполняет эту таблицу адресами обработчиков кто угодно: bios - своими адресами, дос-другим, вирус - своими ;) Аппаратно прерывания имеют свои номера: те процессор в момент прерывания знает лишь: 1) Произошло прерывание; 2) Номер прерывания. Далее по номеру прерывания он вычисляет адрес обработчика по ТАБЛИЦЕ АДРЕСОВ: Номер прерывания x 4 = Адрес в памяти Адреса Обработчика; Извлекая найденный адрес, Он передает на него управление и запоминает в стеке адрес той точки основной программы, которая выполнялась на момент прерывания, чтобы вернуться к ней впоследствии, а также регистр флагов: Действия процессора по сохранению контекста прерванной программы: push Flags push segment push offset jmp dword ptr 0000:[Номер прерывания x 4] Вызванный обработчик прерывания может сразу же вернуть управление прерванной программе одной командой: iret Которая пользуясь сохраненным контекстом прерванной программы на стеке (выше) вернет управление: Действия процессора по возвращению управлению прерванной программе: Flags <- Флаги со стека Восстановить стек jmp на сохраненный адрес в стеке. Таким образом, в памяти находятся программы, выполняющиеся в момент того или иного прерывания. А теперь ответ на вопрос. Их можно вызывать программно. Те не процессор переключает задачу на них, а сам программист специальной командой int: int NN, NN - Номер прерывания, опкод 0xCD,0xNN (2 байта). После выполнения этой команды ДЕЙСТВИЯ ПРОЦЕССОРА АБСОЛЮТНО ЭКВИВАЛЕНТЫ его реакции на аппартное прерывание. Разумеется, вызвать код обработчика можно не только командой int, а и call far, jmp far, retf... и т.д. Просто так удобнее ;) Таким образом появляется возможность вызывать сервисы ОС, БИОС и всякие другие через Таблицу Адресов прерываний. Это удобно прежде всего тем, что вызов можно осуществить лишь ЗНАЯ НОМЕР ПРЕРЫВАНИЯ (иногда говорят "номер вектора") в отличии от того случая, когда вызов осуществляется по заданному адресу. Так, например в ОСь Linux осуществляется всего лишь вызовом int 80h в отличии от других Unix, где, к примеру, системную программу можно вызвать через дальний call: call 0000007 ; Вызов системы в одном из unix. ДОС может быть вызван по нескольким прерываниям: int 20h, int 21h, int 23h, int 24h, ... ,int 25h, int 26h... БИОС: int 10h, int 13h, int 15h, ... А вот в winNT можно вызвать систему также, в отличии от win98: int 2Eh ; Вызов WinNT и ее наследников из пользовательского кода. -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
Jon |
|
|||
Unregistered |
Почему в уроке 3 вы написали что видеобуфер начинаеться с A0000h, а в программе надо записывать 0A000h?
|
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Потому, что в программе мы оперируем содержимым сегментного регистра для доступа к памяти:
mov ax,0a000h mov es,ax в то время как процессор вычисляет адрес ячейки памяти следующим образом: Адрес = Сегментный регистр(es - тот, который используется) x 16 + смещение. Собственно, об этом я и писал где-то тама ;) -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
Jon |
|
|||
Unregistered |
Как считать значение ячейки и вывести её значения на экран.Допустим 1beh
|
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 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. |
|||
|
||||
Ramstar |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 7.12.2002 Репутация: нет Всего: 1 |
Win95chih модифицируйте а потом в нет выложите и все дела и будет мир играть в войну
|
|||
|
||||
dr.ZmeY |
|
|||
Политолог Профиль Группа: Участник Клуба Сообщений: 3892 Регистрация: 26.3.2002 Где: ..::STALINGRAD::. . Репутация: нет Всего: 60 |
Chingachguk, в чём различая вывода на экран в режиме записи 1 и 2, если можно, на примере поясни...
|
|||
|
||||
Chingachguk |
|
||||||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Я не совсем понял, что ты имеешь в виду. Если ты про то, что
так тут (собственно, в уроке 3 про это и рассказывается) идет речь о том, в процессоре адрес ячейки памяти формируется из двух частей - регистров: сегментного и смещения: Адрес = сегментный регистр * 16 + регистр смещения; Причем смещение может быть задано в самой команде или же построено даже из комбинации нескольких регистров (максимум - 2-х) и смещения ! Таким образом, раз мы задаем адрес из двух частей, то мы можем играться обеими частями таким образом, то общий адрес будет одним и тем же ! Вот там-то и был пример этого: можем рисовать одно и то же (заносить в одну и ту же память числа) двумя способами(или большим числом): 1. Задав сегмент равным 0A000h:
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. |
||||||
|
|||||||
dr.ZmeY |
|
||||||
Политолог Профиль Группа: Участник Клуба Сообщений: 3892 Регистрация: 26.3.2002 Где: ..::STALINGRAD::. . Репутация: нет Всего: 60 |
Вот пример установки режима записи 2:
Режим записи 1:
с точкой всё выходит, но при попытке создать линию, в режиме записи 2 на экран выдается какая-то хрень, а точнее точки находящиеся на расстоянии, а в графическом режиме 0013h и того хуже... |
||||||
|
|||||||
NightGoblin |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1021 Регистрация: 24.11.2002 Где: 127.0.0.1 Репутация: нет Всего: 11 |
Если немного оптимизировать: 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 |
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
to Snick_Y2K:
У меня где-то дома валялся код для работы с битовыми плоскостями, все никак не донесу ;) Но будет ! А в 13h режиме вроде тока палитру менять через порты можна ;) Точки делать нужно просто через mov(movs). to NightGoblin: Ага, это известная фича. А вот слабо оптимизнуть вот эта:
-------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
NightGoblin |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1021 Регистрация: 24.11.2002 Где: 127.0.0.1 Репутация: нет Всего: 11 |
2 Chingachguk:
Честно говоря, реально оптимизировать, наверное, действительно слабо Но я тут порылся немножко, нашел одно место... Если где приемник с источником спутаю - мне пришлось с Intel'а на AT&T переводить и обратно, так как с nasm разбираться, а тем более ставить DOS, лень... В общем, так должно быть немножко быстрее... Да, заодно сделал на 32-битных регистрах, так что максимальное значение числа 4G вместо 64K
-------------------- 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 |
|||
|
||||
ARTi |
|
|||
Unregistered |
Вопрос: как наиболее универсально инициализировать звуковуху? То есть, предполагается, что в системе стоит нечто совместимое с SB и работа идет с ним или же нет?
Ситуация такая: был (и сейчас есть) эмуль ZX Spectrum под DOS в защищенном режиме. Хочется перевести его под DPMI, а винда его как раз поддерживает. В dos'е тоже можно запустить cwsdpmi.exe - и вот вам dpmi под dos. Так вот, в досе ясное дело как работать с звуковухой, а вот в винде он не везде эмулируется или эмулируется, но через зад. Есть ли универсальный способ работы со звуковухой и в досе, и в виндах? P.S. Если кто хочет, выложу всякие процедурки для работы с экраном. P.P.S. А причем, извиняюсь, этот ... паскаль? Он к асму вообще никакого отношения не имеет, разве что только всего лишь поддерживает... |
|||
|
||||
XpyDi |
|
||||||
Шустрый Профиль Группа: Участник Сообщений: 114 Регистрация: 25.11.2002 Где: USSR Репутация: нет Всего: 2 |
смотря какие винды, хотя лучше попробовать впихнуть в этот эмуль свои нормальные процедуры для работы со звуковой картой.
Говорю только за себя. Мне лично не нужно.
Не всем легко сразу пересесть на ассемблер, а когда знаешь паскаль, то с ассемблерными вставками проще понять как это работает(по крайней мере на первых порах). |
||||||
|
|||||||
ARTi |
|
||||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 7.1.2003 Репутация: нет Всего: нет |
Желательно любые винды. Но в 98-х поддержки SB в DOS-окне у меня почему-то нет (звуковуха - Audigy), а вот в XP есть, но с горем пополам. То есть, кто-то определяет, а кто-то нет, более того, звук, если и есть, то очень прерывистый, до тех пор, пока не повысишь приоритет до real time, но тогда уже ничего нельзя делать - просто сидеть и смотреть в экран...
В смысле? Когда знаешь "волшебные" слова BEGIN и END ? |
||||
|
|||||
NightGoblin |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1021 Регистрация: 24.11.2002 Где: 127.0.0.1 Репутация: нет Всего: 11 |
Как правило, делается это через 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 |
|||
|
||||
ARTi |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 7.1.2003 Репутация: нет Всего: нет |
NightGoblin
Спасибо, но я, в общем-то, в курсе . Просто в моей проге до этого даже дело не доходит (автодетект никак не может определить irq), а в других всяких там игрушках под дос, где, я думаю, все делается как раз правильно, звук прерывистый и искаженный. В принципе, я вот думаю - ну сделаю я этот автодетект, но у меня, видимо, будет такой же искаженный звук как и везде. А привязываться именно к винде не хотелось бы. |
|||
|
||||
NightGoblin |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 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 |
|||
|
||||
ARTi |
|
|||
Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 7.1.2003 Репутация: нет Всего: нет |
Да, книга Зубкова - достаточно крутая, вот если б ее лет эдак 7-8 назад...
А то все так: документаций нет - добываешь инфу кропотливым трудом и намеренными страданиями ;), а потом - бац! - так необходимая когда-то дока тут как тут! |
|||
|
||||
[auxx] |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 148 Регистрация: 2.2.2003 Репутация: нет Всего: нет |
Мне очень помогла книга В.Ю. Пирогова. До нее я асм знал, а писать не умел.
|
|||
|
||||
Vco |
|
|||
Опытный Профиль Группа: Участник Сообщений: 311 Регистрация: 13.2.2003 Где: Москва Репутация: нет Всего: нет |
Вот это супер прога )
Отключает свсе регистры компа...)) Хотя думаю это несложно. Сам я когда паскаль учисл (немного), интересовался асемблером т.к. на паскале изварённый метод работы с прерываниями, а асма удобнее... правда сам почти нечего не знаю... но не чего, зато дельфи учу -------------------- Я всегда где-то рядом...! |
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Не регистры, а в win98 вводит в транс драйвер, вирутализирующий флаг прерываний VIF ;) В NT++ это уже не работает. А в досе просто cli, @L:jmp @L достаточно. -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
Vco |
|
|||
Опытный Профиль Группа: Участник Сообщений: 311 Регистрация: 13.2.2003 Где: Москва Репутация: нет Всего: нет |
мда сразу видно ассемблер знает =)
блин я разрываюсь...то дельфи, до ещё, что, та ассемблер=)) -------------------- Я всегда где-то рядом...! |
|||
|
||||
Mikel |
|
|||
Опытный Профиль Группа: Участник Клуба Сообщений: 882 Регистрация: 30.3.2002 Где: Саратов Репутация: нет Всего: 2 |
А вложенные циклы как можно сделать? Например, линии через одну нарисовать.
-------------------- ...so remember, it's better to burn out than to fade away |
|||
|
||||
Wowa |
|
|||
Эксперт Профиль Группа: Админ Сообщений: 15017 Регистрация: 14.9.2000 Где: Винград Репутация: нет Всего: 290 |
Народ, может быть будем задавать вопросы, типа:
в отдельной теме? а здесь только будут уроки. |
|||
|
||||
Chingachguk |
|
||||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Не, я думаю - нормально. Ведь он задал вопрос по урокам... Вот вложенные циклы: с декрементом счетчика (cx) и инкрементом (si) ...
-------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||
|
|||||
Mikel |
|
|||
Опытный Профиль Группа: Участник Клуба Сообщений: 882 Регистрация: 30.3.2002 Где: Саратов Репутация: нет Всего: 2 |
Вот тоже написал
Жду замечаний, комментариев. И вопрос- а как можно было бы соединять линиями эти точки, если использовать ещё и паскаль- то понятно, а на чистом ассемблере?
Это сообщение отредактировал(а) Mikel - 26.2.2003, 03:28 -------------------- ...so remember, it's better to burn out than to fade away |
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Вот так:
Следует заметить, что код процедуры line256 я писал давно, когда только начал изучение ассемблера ;) -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
Dark |
|
|||
Unregistered |
Спасибо, Chingachguk, очень круто, мне понравилось, да... странно, ноя тоже взялся за етот непростой труд - туториалы Круто объясняешь, я по моему хуже...
:-((( мою версию покачто моно взять на Моя версия Спасибо, если дашь коментарий... можешь написать мне на [email protected] |
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Извини, что не посмотрел сразу, Dark
Обязательно гляну и отпишу ! -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
GriKo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 7.6.2003 Где: Израиль Репутация: нет Всего: нет |
Ну самое простое должно быть наверное вот так :
begin {Устанавливаем графический режим монитора 13h, 320x200, 256 цветов} asm mov ax, 00013h int 010h end; asm {Кусок рисования} mov ax, 0A000h mov es, ax mov bx,0 @rep: mov byte ptr es:[bx],4 add bx,1 cmp bx,200*320-1 jbe @rep end; {Ожидаем нажатия клавиши} asm mov ah,0 int 16h end; {Устанавливаем текстовый режим монитора 03h, 80x25, 16 цветов текста и фона} asm mov ax,0003h int 10h end; end. |
|||
|
||||
GriKo |
|
|||
Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 7.6.2003 Где: Израиль Репутация: нет Всего: нет |
sorry, я немного подтормозил с ответом... =)
|
|||
|
||||
Chingachguk |
|
||||||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Это ты закрашиваешь весь экран красным цветом ? Да, можно и так. А можно и так:
или даже так:
А вот сможешь ли ты нарисовать линию в этом графическом режиме ? Входные данные: (X1,Y1) и (X2,Y2) - точки. -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||||
|
|||||||
Oleg Grafov |
|
|||
Unregistered |
Киньте что-нибудь по написанию резидентов, а еще лучше, если кому не трудно, киньте код следующей проги , очень надо:
Сохранение/восстановление экрана При нажатии одной из клавиш видеопамять текущей страницы текстового экрана(вместе с атрибутами) сохраняется в памяти. При нажатии другой комбинации клавиш в текущую видеостраницу загружается ранее запомненная копия. Помогите, просто нет времени писать самому |
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
-------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
Uchenik |
|
|||
Unregistered |
Chingochguk ! Я прилежно исследовал первые 3 урока , сделал все домашние
задания и смиренно жду 4-й урок. |
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Хм. Я давно думал что-то написать в продолжение, вот только не решил, что именно. Смысл в том, что начальная теория, я считаю, изложена и далее должна идти практика. Практика позволит закрепить знания и улучшить технику. Вопрос в том, какая именно практика: порты ввода-вывода, работа с прерываниями, передача и получение параметров в/из ассемблерного кода из/в язык Паскаль (или Си) или вообще что-то типа написания кода загрузчика (MBR-сектор).
Вообщем, пишите Ваши пожелания - что именно Вы бы хотели узнать о Машине - и, возможно, мы сделаем это на языке ассемблера ;) -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
vanya |
|
|||
Unregistered |
Помогите зарегистрированному Ламмеру с прогой Ассемблер!
|
|||
|
||||
Shuricksoft |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 177 Регистрация: 27.3.2002 Где: Odessa, Ukraine Репутация: нет Всего: нет |
Chingachguk, вот я бы хотел изучить работу с внешними устройствами - объяснишь заодно и порты, и прерывания =) А потом бы хотел загрузчик. Вот тебе пожелания - надеюсь, ты их осуществишь в ближайшем времени, за что я тебе заранее благодарен
|
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
О'кей ;)
Приянто к сведению ;) -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
Baa |
|
|||
Эксперт Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: нет Всего: 12 |
Shuricksoft, на wasm.ru сейчас идет серия статей про загрузчики...
-------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
Shuricksoft |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 177 Регистрация: 27.3.2002 Где: Odessa, Ukraine Репутация: нет Всего: нет |
Baa, сенкс! Завтра гляну... Но всё равно Chingachguk forever :-)
|
|||
|
||||
Chingachguk |
|
||||||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Урок 4: прерывания.
Итак, в этом уроке мы попробуем "почувствовать" прерывания. Что такое прерывания ? Допустим, вы решаете идете по лесу и собираете грибы. Ваш мозг, вероятно, думает о том, где же спрятались эти белые, лисички и т.п. Вдруг вас кусает комар. Практически не задумываясь вы бьете рукой по месту укуса и думаете себе дальше о грибах. Проанализируем ситуацию с точки зрения посторения программного кода. Иногда это называют странными словами "построить блок-схему", но мы ограничимся обывательским методом описания: Основная процедура поиска:
Процедура обработки события "укусил комар":
Таким образом, мы написали костяк основной процедуры поиска грибов и вспомогательную подпрограмму реакции на укус комара. Как же нам связать их в одну целую программу ? Ведь в любой момент выполнения основной программы может быть нужно выполнить подпрограмму обработки кусания и безболезненно вернуться к выполнению основной. Здесь нам на помощь приходят так назывемые "прерывания". Смысл в том, что будет использован некий диспетчер, который будет по необходимости вызывать ту или иную подпрограмму. В нижеизложенном примере решается следующая задача: основная программа рисует квадрат в некотором месте с некоего начального размера до максимального, но специальная подпрограмма, получающая управление по тикам таймера принудительно изменяет случайным образом месторасположение квадрата на экране и его цвет, тем самым заставляя рисовать квадрат основной код на новом месте:
Задания: 1. В приведенном коде попробовать отключить принудительное изменение цвета или координаты начала квадрата; 2. Попробовать переписать код, рисующий квадраты, на ассемблере; 3. (Самое сложное !) изменить частоту принудительной смены параметров отрисовки с большей на меньшую (например, 1 раз в секунду). -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||||
|
|||||||
Shuricksoft as a guest |
|
|||
Unregistered |
Hi! =)
Наконец-то у меня появилось свободное время и я взялся за урок! =) Спишу доложить результаты =) Сделал задания 1 и 3 без проблем, за второе пока не брался, завтра займусь. 1. Отключить принудительное изменение координаты начала можно, убрав строку mov word ptr es:MyScreenCenter,ax Для цвета - строка mov byte ptr es:MyScreenColor,al 3. Привожу изменённый кусок кода:
Теперь вопросы. Что означает новый оператор lds и как используется? Как используется оператор mul? Почему MyRandVal умножается именно на 16807? Пока что всё... P. S. Теперь буду стараться значительно чаще заходить сюда и учить уроки ассемблера =) |
|||
|
||||
Shuricksoft as a guest |
|
|||
Unregistered |
О, я даже чуть оптимизировал третье задание с утра =)
Как я понимаю, с регистрами работать намного быстрей и приятней, чем с переменными, поэтому...
Сейчас займусь вторым заданием =) А вопросы остаются прежними... |
|||
|
||||
Chingachguk |
|
||||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Хм... Первый вариант (теоретически) был верный (я насчет 1 раз в секунду). Во втором случае никто не гарантирует сохранение регистра CX на пути от приложения (основной код, рисующий прямоугольники) через обработчик прерывания BIOS к нашему обработчику прерывания и обратно. Кроме того, "не хорошо" менять в обработчике прерывания регистры "как угодно", если только это не предусмотрено специально (например, для передачи параметров и т.п.) Поясню на примере, почему это может быть неверно. Допустим, в машине работает только два куска кода:
; Прерывание MyHandler: ; ... ; Основной код MainCode: ; ... Прерывание получает управление асинхронно, т.е. случайно во времени относительно выполнения MainCode - например, 20 раз в секунду. Если теперь написать: ; Прерывание MyHandler: cmp cl,18 jb @@Skip ; ... @@Skip: inc cl ; Основной код MainCode: mov cl,0 @@MainCycle: ; We dont use CX here ! jmp @@MainCycle То вроде все OK - и только прерывание меняет регистр внутри себя. На самом деле первым получает управление BIOS и картинка усложняется: Приложение -> (прерывание)BIOS-код -> Твое прерывание-> Обратно в BIOS->Обратно в Приложение. Например: ; Прерывание MyHandler: cmp cl,18 jb @@Skip ; ... @@Skip: inc cl ; BIOS StartBIosInt8Handler: ; ... ; А вдруг BIOS тут использует CX ? call MyHandler ; А вдруг BIOS тут использует CX ? iret ; Основной код MainCode: mov cl,0 @@MainCycle: ; We dont use CX here ! jmp @@MainCycle Но это не главное. Ведь вряд ли в реальном коде, который использует прерывания, можно обойтись без использования CX. Например, обработчик от таймера переодически опрашивает устройство, а основной код - это интерфес с кнопками. Поэтому гораздо проще сосредоточить внимание на небольшом коде обработчика нежели везде следить за тем, чтобы не юзать CX. А если ты используешь стандартные библиотеки Паскаля (СИ, etc ?). Ну а первый вариант, как я говорил, верный.
lds - это более краткий способ написать пару команд: mov SEG_REGISTER,memory+2 mov USAL_REGISTER,memory Например, такой случай: в памяти, доступной через es:[bx+20] лежат два слова: смещение и сегментный адрес, которые надо занести в регистры ds:dx: mov dx,word ptr es:[bx+20] mov ds,word ptr es:[bx+20+2] С помощью lds это сделать проще: lds dx,dword ptr es:[bx+20]. Существуют также команды les (es), lss (ss). Однако работа с сегментными регистрами уже остается только дос-приложениям или коду уровня ядра. Win32-код очень редко использует их. LDS является сокращением от ~"load pointer using DS".
Оператор mul - это команда целочисленного умножения. Всегда умножается регистр AX или AL (в 32 битном коде - eax) на другой регистр или память: mov ax,10 mov bx,10 mul bx ; В результате в паре dx:ax содержится unsigned long 100 mov al,10 mov bl,10 mul bl ; В результате в ax содержится unsigned short 100 MyVar db 10 ; ... mov al,10 mul byte ptr MyVar ; В результате в ax содержится unsigned short 100 Существуют также команды знакового умножения imul. Почему умножение на 16807 ? Это довольно-таки от балды взятое число из генератора псевдослучайных чисел. Общий вид конгруэнтного генератора: static unsigned long RandVal; void RandSeed(void) { RandVal=time(NULL); } unsigned long Rand(void) { RandVal=RandVal*A+B; return(RandVal); } Таким образом, следующее число генератора на i-м шаге равно: RandVal[i+1]=(RandVal[i]*A+B) mod 2^32 (зависит от размерности ulong). В моем случае я не делал чего-то особо сложного, а выбрал: A=16807; B=0; Размерность - 2^16 (Word). -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||
|
|||||
Shuricksoft as a guest |
|
|||
Unregistered |
Chingachguk, я тоже засомневался по поводу CX, но проверил - работает =) А потом подумал: ведь основной код данной программы не использует этот регистр. БИОС его использовать также не может. Почему? А потому что, когда мы юзаем CX в основном коде, БИОС точно так же получает управление, но ничего страшного не происходит, следовательно CX БИОСу не нужен. При использовании стандартных библиотек Паскаля или С могут быть ошибки - тут я с тобой полностью согласен. Но в нашем случае это не принципиально =)
По поводу ответов на мои вопросы всё понятно, спасибо. Теперь переделка кода рисования на ассемблер:
Но! Квадраты рисуются очень медленно, а на первых порах ещё и цвет фона меняется. В чём ошибка? И ещё: как записать if MyScreenBarSize>=MaxBarSize then MyScreenBarSize:=1; на ассемблере? А для организации repeat until keypressed надо ставить свой обработчик на прерывание клавы? И нельзя ли значения переменным присваивать напрямую, а не через регистры? |
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
О, это тонкая ошибка ! Попробуй сам догадаться, в чем дело (верный код):
По поводу быстродействия - попробуй также решить сам задачу оптимизации тела этих двух циклов. Подсказка: если что-то можно сделать вне цикла, то это следует вынести за цикл. Именно не оптимизировать, заменив переменные IndX и т.п. на регистры. -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
Shuricksoft as a guest |
|
|||
Unregistered |
По-моему, единственная разница при выполнении новой версии кода - это то, что при окончании цкла значение IndX или У = MyScreenBarSize + 1 (у меня - просто MyScreenBarSize). Цикл же выполняется для одинаковых значений в обоих случаях. Но ведь Паскалевское for IndX := 1 to MyScreenBarSize в конце тоже выдаст MyScreenBarSizr (без 1). Я что-то совсем запутался :-/
По поводу оптимизации, пользуясь твоей подсказкой, вынес строки mov ax,0A000h mov es,ax непосредственно перед началом циклов. Больше ничего сделать не смог. |
|||
|
||||
Chingachguk |
|
||||||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Нет, дело не в этом ;) Смотри, я вернул почти все к тому варианту, который был у тебя:
Разница - в двух командах.
Все абсолютно верно ! -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||||
|
|||||||
Shuricksoft as a guest |
|
|||
Unregistered |
О, всё, я понял свою ошибку =)
Кстати, заодно, если тебе не сложно, приведи, пожалуйста, все известные тебе версии команды jmp с описанием (ну, jnz, jb, jbe - это понятно, а ещё какие?). Это хорошо, что верно =) Продолжаем? |
|||
|
||||
Mura-vey |
|
|||
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 22.4.2003 Репутация: нет Всего: нет |
Chingachguk Я внимательно ознакомился с уроками, задания правда не делал, но обязательно попробую как будет время.
Теперь самый каверзный вопрос: Как связать паскаль и ассемблер ? Сколько не пытался не получалось. Надо что бы просто и доступно было. Это сообщение отредактировал(а) Mura-vey - 22.9.2003, 00:48 |
|||
|
||||
Monty |
|
|||
Advanced Lamer Профиль Группа: Участник Клуба Сообщений: 3511 Регистрация: 3.4.2003 Где: Гваделупа Репутация: нет Всего: 27 |
Можно так
Это сообщение отредактировал(а) Monty - 22.9.2003, 01:29 -------------------- ... О, вещая моя печаль, О, тихая моя свобода И неживого небосвода Всегда смеющийся хрусталь! |
|||
|
||||
Chingachguk |
|
||||||||||||||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Ну я не думаю, что имеет смысл приводить кусок справочника или руководство от интела. Наоборот, моя концепция изучения такова: пытаемся что-то сделать -> появляется мысль -> как я могу ее реализовать ? -> мне нужна такая-то команда -> она есть ? -> есть, отлично. Использую ее сейчас, да и на будущее запомню. В общем и целом все команды сравнения основываются вот на чем: для сравнения чего бы то ни было процессор использует сложение (вычитание - это тоже сложение). Сложение двоичных счетчиков. На основании результата модифицируется так называемый регистр флагов - вспомогательный регистр процессора. Все команды сравнения используют этот регистр для анализа. Например, мы хотим проверять, вышли ли мы за пределы размерности байтовой переменной при сложении регистров AL и AH:
Требуемая логика: так как в регистре al 8 бит, то максимум, который может быть в нем - это число 255 (без знака) (или 0xFF или $FF или 011111111b или...). При сложении 10 и 10 в al будет 20, при сложении 100 и 100 - 200, при сложении 254 и 1 будет 255, а вот если сложить 255 и 1, то будет 0. Напоминаю, процессор складывает регистры как двоичные счетчики (типа связанных в цепочку триггеров) без насыщения, те если все биты (триггеры) в состоянии 1, то следующий добавляющий импульс последовательно сбросит все биты в 0. Так вот, нам нужно знать, когда произошел такой вот переход (те сумма Value1+Value2 > 255):
Как это сделать ? Есть такой факт, что процессор контролирует факт переноса (перехода через максимальное значение) устанавливая в определенное состояние определенный бит регистра флагов. Этот бит имеет название CF (Carry Flag). Таким образом, после сложения можно опереться на этот факт:
Команда jnc как раз проверяет, установлен ли флаг CF. Точнее говоря, она проверяет его состояние (я не помню, 0 или 1 является признаком переноса). На таких вот изменениях регистра флагов и основаны все команды условных переходов. В регистре флагов несколко таких флажков.
Да, вот как раз про флаги заговорили. Давай уж на них немного остановимся. Попробуй поизучать влияние различных команд сложения или вычитания на регистр флагов. Первые 8 бит регистра флагов можно получить командой:
Попробуй вывести состояние регистра флагов. Если сможешь, понаблюдай за тем, как он меняется после различных команд сложения, вычитания... и т.п. Поиграйся с ним, короче ;)
Гм, я как раз тут об этом все время говорю. Попробуй задать конкретный вопрос ;) Например: как мне сложить две пас-переменные с помощью ассемблера или как мне написать функцию на ассемблере, получающую указатель на массив WORD'ов и сортирующую его и т.п. -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||||||||||||
|
|||||||||||||||
Mura-vey |
|
|||
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 22.4.2003 Репутация: нет Всего: нет |
Хорошо, тогда задачка такая. На паскале мы вводим одномерный массив А[1000] и сортируем его на ассемблере, а выводим снова в паскале.
|
|||
|
||||
Mura-vey |
|
|||
Новичок Профиль Группа: Участник Сообщений: 45 Регистрация: 22.4.2003 Репутация: нет Всего: нет |
Разумеется прога сортирования написана отдельно! Полученый обж мы должны слинковать с прогой на паскале.
|
|||
|
||||
Shuricksoft as a guest |
|
|||
Unregistered |
По поводу регистра флагов нашёл, что за перенос отвечает младший (самый правый =) ) бит. 0 - переноса нет, 1 - есть. Потом нашёл в отладчике, где отображается этот регистр =) Там нашёл ZF, принимающий значение 1, если результат сравнения "равно" и 0, если "не равно". Больше ничего толком не понял. Там есть ещё что-то интересное? =) Кстати, не уловил, где "больше-меньше" указывается? Или это проверяет сам компилятор вычитанием?
|
|||
|
||||
Chingachguk |
|
||||||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Сначала по поводу вызова асм-кода. Этот код помещаем в файл sort_bub.asm и компиллируем:
masm sort_bub Должен получится файл sort_bub.obj Теперь паскаль:
Но я предпочитаю не размещать асм-код в отдельных файлах, а писать его в асм-вставках в теле паскалевских программ. -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||||
|
|||||||
Chingachguk |
|
||||||||||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
С помощью lahf ? Если так, то ты выполнил "задание" !
А пока особо ничего и не надо ;) Я же говорю - при решении конкретной задачи возникает необходимость чего-либо, тогда и узнаешь все досконально. В данном случае регистр флагов - это "самый нижний" уровень, доступный программисту. А не команды условных переходов. Ведь, изучая ассмеблер, стремишься добратся до "самого основания", пуркуа па ? То, что ты обратил внимание на существование отладчика - хорошо !
Нет, компиллятор ничего не делает. Он просто втыкает команды, причем не всегда удачно. Попробуй разобраться, как выполняются команды условных переходов из серии "больше-меньше". Приведу их примеры:
Попробуй сравнить таким образом разные аргументы, понаблюдай за флагами. А вот и задание (достаточно сложное !). Пусть есть команда сравнения AX и BX и условный переход после:
Требуется: инвертирование результата сравнения после команды cmp ax,bx после команды cmp и перед командой jb (выделено <...>). Что имеется в виду ? Допустим, если ax=10, а bx=300, то результат будет "меньше". Необходимо сделать его "больше или равно", чтобы команда jb получила его (в регистре флагов - а где еще ?). Если же результат сравнения будет "больше или равно", то нужно сделать его "меньше". Для выполнения задания требуется команда загрузки регистра флагов значением. Этой командой может быть sahf - загрузить регистр флагов из регистра ah или popf (из стека). Честно говоря, я это задание выдумал тока что, не проверяя его реализуемость. Но я думаю, все будет хорошо ;) -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||||||||
|
|||||||||||
Shuricksoft as a guest |
|
|||
Unregistered |
Да, с помощью lahf
Ну, я имел в виду, что компилятор суёт команды вычитания, то есть, программа проверяет, засунутыми командами. Вычисляет разность, проверяет флаг переноса и дальше реагирует, как ей надо. Предыдущая гипотеза подтверждается тем, что, как я обнаружил, за меньше-больше тоже отвечает флаг переноса... Если 1 - меньше, если 0 - больше. Ну, а за "равно", судя по всему, отвечает четвёртый слева бит. Задание я понял. Идея тоже есть. Но не могу осуществить, пока не узнаю, как получить доступ к отдельно взятому биту регистра... Ломал голову довольно долго, да решил у тебя спросить =) Ну, никак не могу понять, как инвертировать в регистре один-единственный (ну, или, в нашем случае, два) бит... |
|||
|
||||
Chingachguk |
|
||||||||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Если ты писал на СИ (а ведь писал, не так ли ?), то должен был видеть вот такие операторы: "^","|","&","~". Это так называемые битовые операторы: xor, or, and, not... Естественно, они есть и в ассемблере. Только работать с битами на нем гораздо легче ;) Набор команд больше и они гибче:
Легче потому, что в асме команд для битов больше и они гибче. Это и понятно - ассемблерный код должен уметь заставить процессор делать все, что тот умеет, а процессор работает также и с битами. Например, в языках высокого уровня нет команды test. Обычно для проверки битов пишут что-то вроде:
Но ведь можно написать:
Вот так -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||||||
|
|||||||||
Shuricksoft as a guest |
|
|||
Unregistered |
На Си я писал довольно мало. В основном, на Паскале. And, or, xor, not я видел, но не знал, что они делают :-/ Поэкспериментировав, пришёл к выводу, что xor ax,i инвертирует i-тый бит регистра ах; and ax,i устанавливает туда 0; or ax,i - устанавливает 1; not ax инвертирует все биты. Все это установил на основе экспериментов, так что если я что-то понял неправильно, поправь меня, плз =)
Таким образом, получается вот такой код там, где <...>
Этот код на "ура" меняет больше на меньше и наоборот. Несколько по-другому дело обстоит с "равно". В данном примере (приведённом тобой коде) такой фокус работает. Но если проверять через je или jne, то получается, что ни один бит (после неудачных попыток определить, какой нам нужен, проверял все подряд) при инвертировании не инвертирует результат :-/ Почему так? |
|||
|
||||
Shuricksoft |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 177 Регистрация: 27.3.2002 Где: Odessa, Ukraine Репутация: нет Всего: нет |
Я вчера ночью перед сном разобрался с and, or и xor, так что предыдущую версию этого поста считать недействительной =)
Но просьба в силе: приведи, плз, паскалевский эквивалент value&(1<<i). Остальное понял, а вот что значит два знака << и почему это в скобках - неясно =) А рабочий код, работающий с "равно", приведу чуть позже =) Это сообщение отредактировал(а) Shuricksoft - 5.10.2003, 19:29 |
|||
|
||||
Shuricksoft |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 177 Регистрация: 27.3.2002 Где: Odessa, Ukraine Репутация: нет Всего: нет |
Вот этот код, с виду, работает. Инвертирует значение флага равенства и флага "больше-меньше". Можно, конечно, проверять, надо ли нам инвертировать флаг равенстсва, но к изменению результата это не приведёт, а код увеличит, уменьшив быстродействие =)
|
|||
|
||||
NightGoblin |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1021 Регистрация: 24.11.2002 Где: 127.0.0.1 Репутация: нет Всего: 11 |
Shuricksoft,
не знаю как в паскале, а операторы << и >> в си - это операторы логического сдвига, на асме это команды SHL/SHR соответственно: сдвигают битовое значение регистра влево/вправо, заполняя освободившиеся биты нулями... Плюс, есть SAR для чисел со знаком (арифметический сдвиг) - в этом случае биты, освобождающиеся после сдвига, заполняются не нулями, а старшим (знаковым) битом. Еще в асме есть хорошие команды циклического сдвига (ROR/ROL/RCR/RCL), которых, к сожалению, на си нет. -------------------- 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 |
|||
|
||||
Shuricksoft |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 177 Регистрация: 27.3.2002 Где: Odessa, Ukraine Репутация: нет Всего: нет |
NightGoblin, что самое весёлое, в Паскале slr/shr команды так и пишутся =) Эх, ещё раз убеждаюсь, что Паскаль явно удобней С. Но это уже отдельная история =)
А вот sar/ror/rol/rcr/rcl в Паскале тоже нет. |
|||
|
||||
Chingachguk |
|
||||||||||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
В Паскале в этом смысле все то же самое - ну, об этом уже написали. В этом конкретном примере же:
Я думаю, с этим пока достаточно ;) Главное было разобраться в общем, а в деталях в конкретной задаче ты разберешься сам ! Следующее занятие (урок), если я соберусь со временем, я планирую посвятить BOOT... Пока же, если есть желание, попробуй написать алгоритм построения линии в виде отдельно оформленной функции на языке Паскаль. Т.е. примерно это должно выглядеть так:
Помни, что к переданным параметрам (здесь - по значению) в асм-вставке так и обращаются: mov bx,Y2 или mov al,Color. Также следует знать, что нельзя разрушать входные значения регистров SS,DS,BP,SP (если необходимо, можно сохранить и восстановть их на стеке или (для SS:SP) в ячейке памяти). Однако в данном случае можно определять локальные переменные и спокойно их использовать:
и т.п. Это довольно сложная задача, но с простым условием: построить линию, начинающуюся в точке с координатами (X1,Y1) и заканчивающуюся в точке (X2,Y2). -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||||||||
|
|||||||||||
Shuricksoft |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 177 Регистрация: 27.3.2002 Где: Odessa, Ukraine Репутация: нет Всего: нет |
Кажется, я знаю, как выполнить эту задачу... Только мне надо знать, как производить деление. Нашёл в электронном справочнике, что это делается командой div. Решил проверить на простом коде:
ну, дальше - вывод на экран =) Так вот, после выполнения команды деления выскакивает ошибка деления на ноль! А вроде как делитель не равен нулю и разрядность частного не превышает разрядность регистра... В чём ошибка и как правильно производить деление? |
|||
|
||||
Shuricksoft |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 177 Регистрация: 27.3.2002 Где: Odessa, Ukraine Репутация: нет Всего: нет |
Всё, понял сам =) Всего заменить al на ax =)
|
|||
|
||||
oleg1973 |
|
|||
asm fanat Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: нет Всего: 34 |
деление это не по модному ( я про div оператор)
чтоб на 2 поделить нада вправо на 1 сдвинуть mov eax,10 shr eax,1 все в еах результат будет -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
Shuricksoft |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 177 Регистрация: 27.3.2002 Где: Odessa, Ukraine Репутация: нет Всего: нет |
А с чего ты взял, что я буду на 2 делить? Тем более, мы здесь пока под ДОС асм-ом балуемся, а ты с расширенными регистрами
Это сообщение отредактировал(а) Shuricksoft - 14.10.2003, 14:22 |
|||
|
||||
oleg1973 |
|
|||
asm fanat Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: нет Всего: 34 |
mov ax,10
shr ax,1 под дос вариант а на 2 как у тебя в примере -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
Shuricksoft |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 177 Регистрация: 27.3.2002 Где: Odessa, Ukraine Репутация: нет Всего: нет |
Я понимаю, как это под ДОС выглядит =)
А, ну, значит, пример такой попался неудачный =) Там любое число может быть =) |
|||
|
||||
Chingachguk |
|
||||||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Вот и нет. Спокойно пишем:
Про деление уже писали, а вот есть и команды умножения: mul и imul (знаковая). Кстати, есть знаковое деление: idiv -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||||
|
|||||||
Chingachguk |
|
||||||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Вот и нет. Спокойно пишем:
Про деление уже писали, а вот есть и команды умножения: mul и imul (знаковая). Кстати, есть знаковое деление: idiv -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||||
|
|||||||
oleg1973 |
|
|||
asm fanat Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: нет Всего: 34 |
Chingachguk
-------------------- SST 465555 icq 200-512-712 |
|||
|
||||
NightGoblin |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1021 Регистрация: 24.11.2002 Где: 127.0.0.1 Репутация: нет Всего: 11 |
Chingachguk,
ну это уже машинный код пошел, а не асм =))) -------------------- 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 |
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Байты я забил ибо Пас не "вкуривает" команды выше 286. Даже в obj.
На самом деле для "доса" я даже "такое" писал (это кусок патча):
... Жаль, не застал я времени дос-экстендеров ;((( Это сообщение отредактировал(а) Chingachguk - 15.10.2003, 22:05 -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
Serzh |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 155 Регистрация: 30.9.2003 Где: SPb Репутация: нет Всего: нет |
Я вернулся!!!
Раньше я был Melancholy, но забыл пароль и теперь я Serzh!!! че тута происходит? ;) |
|||
|
||||
Gannibal |
|
|||
Опытный Профиль Группа: Участник Сообщений: 742 Регистрация: 15.4.2003 Где: 010101 Репутация: нет Всего: 17 |
Ну если здес все професионалы так подскажите мне компилатор длыа C+АSМ кроме Борланд и Висуала...tnx
-------------------- Я родился в этом безумном мире - и Я сделаю всё чтобы в нём выжить! |
|||
|
||||
oleg1973 |
|
|||
asm fanat Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: нет Всего: 34 |
gcc, Lcc, watcom
-------------------- SST 465555 icq 200-512-712 |
|||
|
||||
foRaver |
|
|||
Опытный Профиль Группа: Участник Сообщений: 561 Регистрация: 6.7.2003 Где: Düsseldorf Репутация: нет Всего: 3 |
Вот тут книжечку откопал по АСМьу, даже очень классная, всем советую: Assembler for PC
|
|||
|
||||
SashOk_ |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 8.2.2004 Репутация: нет Всего: нет |
Все вышесказанное конечно хорошо и приятно, однако никто не подскажет ресурсы для asm32, посколбку программировать под DOS уже НЕ актуально. Не плохо было бы пару примерчиков представить с коментариями.
|
|||
|
||||
oleg1973 |
|
|||
asm fanat Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: нет Всего: 34 |
примерчик: (компилить в fasm)
format PE GUI 4.0 <----- тут говорим какой файл будем компилить include '%fasminc%/win32a.inc' <----- тут всякие виндосовские значения start: invoke MessageBox,0,txt,txt,0 <--- API рисуем месаджбокс invoke ExitProcess,0 <----API выходим из программы txt: db 'hello world!',0 include '%fasminc%/api.inc' <---- тут собственно описания импортируемых функций для таблицы импорта -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
SKN |
|
|||
Unregistered |
Как мне защитить программу от трассировки по прерываниям и работы под контролем отладчика, с помощью переопределения какого-либо прерывания (например 25h)?
|
|||
|
||||
oleg1973 |
|
|||
asm fanat Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: нет Всего: 34 |
ты уж отдельный топик сделай со своим вопросом
-------------------- SST 465555 icq 200-512-712 |
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Что такое 25h ? Debug прерывания - это int 1 и int 3. Да и где ? В дос ? Тогда в некоторых случаях может помочь переустановка (или использование для саморасшифровки) этих прерываний. Или в win ? От какого отладчика ? -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
SKN |
|
|||
Unregistered |
Что такое 25h ? Debug прерывания - это int 1 и int 3. Да и где ? В дос ? Тогда в некоторых случаях может помочь переустановка (или использование для саморасшифровки) этих прерываний. Или в win ? От какого отладчика ?
OS -=- Win NT 25h -=- номер прерывания, понимаю ответ тупой, но в этой ос не знаю как снять запрет на просмотр векторов прерывания, и отсюда пошли все коллизии, чем дальше в лес тем..... отладчика -=- это я ругнулся на Дизасемблерный софт, SoftIce и так далее, понимаю...тоже не лучшая перспектива их так называть, фактически смысл ограничивается тем, чтобы я смог переопределить это прерывание в Win NT, далее как напутать я вроде придумал идейку |
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Что значит - переопределить "это" прерывание ? Если не знаешь точно, какой номер прерывания, то, может, скажешь, что оно делает ?
-------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
skn |
|
|||
Unregistered |
Что значит - переопределить "это" прерывание ? Если не знаешь точно, какой номер прерывания, то, может, скажешь, что оно делает ?
номер прерывания -=- 25h что делает -=- устанавливает вектор прерывания мне необходимо написать на 25h новый обработчик. мне необходим код который { повесит новый обработчик //мой код вернет все как было } |
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
А ! ж)))
Я понял Вас. Это вектор исключительно досовский. Точнее даже не вектор, а функция (ah=25h) вектора int 21h. Однако в win все сложнее - неудивительно, там столько драйверов. Для некоторых int'ов в win есть службы, их устанавливающие, есть службы, позволяющие встроится в цепочку обработчиков прерывания. Для отладочного прерывания, возможно, существует свой отдельный сервис. Однако (я про 98, но не думаю, что в nt что-то другое) к таким сервисам могут обращатся исключительно драйвера или код, который прорвался в ring0 "нелегально". Да и вообще никто (это справедливо для дос тем более) не может помешать драйверу установить свой обработчик прерывания "вручную", минуя всякие там сервисы системы. Например, защита 1C руками правит idt (таблица векторов защищенного режима) из собственного драйвера (hasp95dl.vxd) и никто ей в этом не мешает. -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
Guest |
|
|||
Unregistered |
прошу прощения я малость перепутал, речь не про функцию а про прерывание 25h( считывание информации напрямую с диска)...
необходим код на который win ругаться не будет |
|||
|
||||
oleg1973 |
|
|||
asm fanat Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: нет Всего: 34 |
оно по любому ругатся будет если попытатся из доса напрямую сектора на харде читать
-------------------- SST 465555 icq 200-512-712 |
|||
|
||||
Vira |
|
|||
Unregistered |
Доброе утро...У меня вопрос:Где взять Help по прерываниям???
|
|||
|
||||
Akina |
|
|||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 1 Всего: 453 |
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
ZAVS |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 121 Регистрация: 25.2.2004 Где: ЕРЕВАН Репутация: нет Всего: 1 |
лучше возмите книгу Абеля и читайте
--------------------
Учись студент доцентом станешь :) |
|||
|
||||
vilfred |
|
|||
Unregistered |
забей, имхо, если есть прога на асме которая делает что-то хорошо и быстро, то винду и линух и можно послать далеко и надолго... Нам вот надо сейчас сделать некоторую обработку файлов формата FITS, была бы эти проги на асме, то в нашей обсерватории было бы все под досом, кроме файрвола линуксового разве что... идеи есть - а как это реализовать быстро - не ясно. А уроки реально - просто рулезные. И написаны тоже так же. Мегареспект! |
|||
|
||||
Гость_Andrew |
|
|||
Unregistered |
Я конечно понимаю что уже дофига говорилось про таймер, но то все про интервалы минимум у которых 55 мс, а как сделать програмку чтоб она каждые 5 мс (или еще чаще) какую-нить цифирку на экран выводила? Если кто может помочь или пример привести не стесняйтесь, пишите .Особенно обрадует если это будет как асмовская вставка в СИ.
|
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Под дос ?
1) Перепрограммирование таймера на другую частоту; 2) Интерфейс прерывания ~int 15h (bios) - вплоть до сотен мкс (!), но не всякая винда его держит. -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
Гость_Andrew |
|
|||
Unregistered |
А можешь простенькую програмку привести, тока полностью на асме написанную
|
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Вот это может работать (задержка в мкс):
-------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
Гость_Andrew |
|
|||
Unregistered |
Так это просто как пауза получается? Но "microseconds" он не понимает, а если его как переменную обозвать то он на синтаксис ругается.
|
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Кто ругается ?! ;) Это вставка в языке Паскаль. Вот как это будет на СИ:
У этого прерывания есть также асинхронный сервис: вызываешь его и указываешь в ~es:bx дальний (far) адрес точки программы, куда должно поступить управление спустя указанное тобой число мкс. -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
Jin X |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 157 Регистрация: 5.3.2004 Репутация: нет Всего: 1 |
Вот тут гляньте: http://filezzz.nm.ru/pub/asm/delay.htm
Если кого звук интересует: http://filezzz.nm.ru/pub/asm/sound.htm Это сообщение отредактировал(а) Jin X - 29.6.2004, 22:13 --------------------
Бойся своей мечты, ибо она осуществима! |
|||
|
||||
Гость_Andrew |
|
|||
Unregistered |
если в качестве msec ставить число, то на микросекунды оно не дотягивет, скорее это на милисекунды похоже, а если попробовать поставить меньше 65 то вообще пауза пропадает? Так что же делать?
|
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Эта функция требует в CX:DX микросекунды. Т.е. CX:DX = 100 - это 100 мкс. Мне надо было сделать милисекунды - я и умножил на 1000.
-------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
scriptcoder |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 106 Регистрация: 8.6.2004 Репутация: нет Всего: нет |
Лично мне понравились туториалы Iczelion'а
--------------------
null |
|||
|
||||
Гость_Andrew |
|
|||
Unregistered |
Но если это число в микросекундах ставить меньше чем 65000 микросекунд, то он выдает постоянный сигнал (вообще нет никакой паузы.)
|
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Приведи код.
-------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
Гость_Andrew |
|
|||
Unregistered |
КОД
#include<iostream.h> #include<dos.h> #include<conio.h> void main() { int d=0,a=0,c=0; unsigned int msec=1000; outportb(0x378,0); do { do { asm { mov ax,msec mov dx,1000 mul dx;// dx:ax microseconds mov cx,dx mov ah,0x86 int 0x15;// wait cx:dx microseconds } a=a^1; outportb(0x378,a); } while(!kbhit()); c = getch(); if (c == 72) msec=msec+1; if ((c == 80)&(msec>1)) msec=msec-1; } while(c!=27); outportb(0x378,0); } Вот. "Лампочка" что к LPT подключена, мигает пока "msec" больше 65, а как тока меньше сделаешь, так сразу просто гореть начинает |
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Может, так и должно быть ? Трудно увидеть частоту моргания > 1000/65 ?
Да и у лампочки должна быть инерция. Вообще-то этот сервис подглючивает, то ли из-за win, то-ли на новых компах. Попробуй команду rdtsc. Она выдает 64-ти четырехбитный счетчик тактов процессора в регистрах edx:eax. Когда проц исполняет команды, он тратит на них такты (частота CPU). Но если ты хочешь универсального кода (на любых компах), то тебе придется калибровать эту процедуру. Допустим, ты измеряешь число тактов за секунду и тогда 0,1 сек - это 1/10 от этого цикла:
Это сообщение отредактировал(а) Chingachguk - 2.7.2004, 13:05 -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
oleg1973 |
|
|||
asm fanat Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: нет Всего: 34 |
я так весь ваш трейд о милисекундах не читал
ну так у нас есть же таймер который вырабатвает int 8 вроде ну дык его надо перепрограмировать на нужый отрезок и все -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
Akina |
|
|||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 1 Всего: 453 |
-------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Да грил я про это... Видимо, в данном случае не требуется что-то большее, чем Super_Delay(unsigned micsec). Вы бы уж тогда и хэндлер новый привели ;) Akina Интересно, что скажет винда на попытку переставить частоту выше, чем ее собственная ? ;) -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
Ivan Ryzhakov |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 4.7.2004 Репутация: нет Всего: нет |
Посмотрел ваши уроки. Очень интересно, а об особенностях порграммирования ассемблером в юникс-системах не могли бы что-нибудь написать?
|
|||
|
||||
antonmasteR |
|
|||
Unregistered |
а где можно найти описание по всем функциям под дос ???
|
|||
|
||||
Guest |
|
|||
Unregistered |
и где можна найти описание по буферам. т. есть где буфер монитора, клавиатуры...
|
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Ivan Ryzhakov
К сожалению, я крайне мало кодировал под *nix, да и то на C. Так что считать себя достойным писать про эту платформу, разумеется, не могу. Рекомендую следуюущие источники: - статья на wasm.ru должна быть специально про *nix. - Зубков С.В. , "Программирование на языке ассемблера". В целом из той литературы, которую я читал по этому вопросу, авторы сходятся на мнении, что под nix писать лучше на си, только оптимизацию отдельных относительно платформеннонезависимых подпрограмм вроде video-вывода (Зубков) имеет смысл писать на асм. С другой стороны (я опять тут не практик) кто-то как-то пишет эксплойты под nix, а это означает достаточно глубокое знание этой платформы. Но вот про эксплойты под nix я литературы не видел, даже у того же Касперски. antonmasteR Ральф Браун, Interrupt List, прерывания int 21h и вспомогательные типа int 23h, 24h, 25h ... etc. Некоторые пишут про TechHelp, но я не юзал. Guest Это очень общий вопрос. Что именно тебя интересует ? Простые примеры работы с Video или Keyboard ты легко найдешь в книгах по ассемблеру. У того же Зубкова есть примеры с текстовым буфером VGA (B8000h), графикой (обычно рассматривают режим 320x200, 256 цветов - про это пишет Зубков). Разумеется, там же можно прочесть про клавиатуру. Источник доступен в электронном виде. Ссылку я уже давал в этом разделе или яндекс. -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
oleg1973 |
|
|||
asm fanat Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: нет Всего: 34 |
в целом под *никсы даже легче чем под виндос писать
очень дос напоминает -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
Jin X |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 157 Регистрация: 5.3.2004 Репутация: нет Всего: 1 |
Народ!!! Вы бы хоть ссылки, которые я привёл почитали
Ничего перепрограммировать не надо, иначе будут тормоза и прочие проблемы. Кому это надо? Значение счётчика (> 1 МГц) можно читать, ничего не перепрограммируя. --------------------
Бойся своей мечты, ибо она осуществима! |
|||
|
||||
antonmasteR |
|
|||
Unregistered |
не могу найти может кинеш линк или на мыло [email protected] |
|||
|
||||
kusa |
|
|||
Unregistered |
А что такое byte ptr <registr> кто-нибудь может объяснить?
|
|||
|
||||
Akina |
|
|||
Советчик Профиль Группа: Модератор Сообщений: 20570 Регистрация: 8.4.2004 Где: Зеленоград Репутация: 1 Всего: 453 |
это указатель на байт, адрес коего в указанном регистре. Т.е. в операции будет задействована ячейка оперативной памяти размером в байт, смещение адреса которой берется из указанного регистра, а сегмент - из сегментного регистра по умолчанию для данного регистра, если таковой не переопределен явно. -------------------- О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума. |
|||
|
||||
Jin X |
|
||||||
Бывалый Профиль Группа: Участник Сообщений: 157 Регистрация: 5.3.2004 Репутация: нет Всего: 1 |
Akina, не правда.
А вот:
--------------------
Бойся своей мечты, ибо она осуществима! |
||||||
|
|||||||
kusa |
|
|||
Unregistered |
Спасибо за пояснения, народ! Правда, с этим я уде потихоньку разобралась
|
|||
|
||||
Guest |
|
|||
Unregistered |
Chingachguk!
А будут ещё уроки? |
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Даже и не знаю... Были мысли про написание загрузчика (тот, что в дискете зовется BOOT а на винте - mbr) и про анализ защиты...
-------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
Guest |
|
|||
Unregistered |
А про алгоритмизацию? Про boot я где-то на www.xakep.ru, а про исследования защиты вообще в Сети полно статей. Только почему то эти статьи о взломе, а не исследовании… Написание алгоритмов – вот это интересно.
Так, пока книгу Кнута читаю. |
|||
|
||||
dragon-gor |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 13.1.2005 Репутация: нет Всего: нет |
Привет всем. Только что я зарегистрировался и поэтому у меня вопрос, будим говорить с опазданием.
В самом начале есть ссылочка - http://chat.ru/~vzubko/tp7.zip, что-то у меня закачки html файла ничего не качает. В чём дело? |
|||
|
||||
oleg1973 |
|
|||
asm fanat Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: нет Всего: 34 |
да просто устарела ссылочка вот и все
видимо нет там больше сайта и нет файла а что за файл? может найдем? -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
ida |
|
|||
замужем Профиль Группа: Завсегдатай Сообщений: 2275 Регистрация: 14.5.2002 Где: Санкт-Петербург Репутация: нет Всего: 60 |
Можно еще покурить рассылку "Низкоуровневое программирование для дзенствующих", по-моему на subscribe.ru. Когда-то там в каждом выпуске были уроки с примерами кода.
Это сообщение отредактировал(а) ida - 14.1.2005, 15:10 |
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Ссылки больше нет, извините ;(
Положу на newmail.ru чуть позже. -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
dragon-gor |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 13.1.2005 Репутация: нет Всего: нет |
Oleg1973, у меня аськи нет (не люблю я ее). Может попробывать поиск по названию файла?
Если найдёшь пиши на [email protected] А насчёт "Низкоуровневое программирование для дзенствующих" есть offline на Wasm.ru Много полезного. Добавлено @ 21:22 tp7.zipo это что, Borland Turbo Paskal ? |
|||
|
||||
oleg1973 |
|
|||
asm fanat Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: нет Всего: 34 |
dragon-gor
а нафига тебе турбо паскаль? -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Да, это турбо паскаль для дос, версия 7.0 или 7.1., безо всяких лишних tpu, только голый компиллер и редактор, был ~600 килобайт. Нужен только как удобное (по моему мнению) средство изучать ассемблер на вставках asm ... end;
-------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
dragon-gor |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 13.1.2005 Репутация: нет Всего: нет |
просто по поиску файла нашёл один паскаль. Думал вдруг в вебе найду
|
|||
|
||||
smoc |
|
|||
Unregistered |
[size=6][/size][color=green][/color]
А нельзя ли начать с простого . Вывод бегущей строки на экран. или самое простое. Ато почитаеш книги так там такие заумные советы : X=y*C=C или чтото в этом роде. Кошмар!!!!! А мне надо попроще, как первокласнику. |
|||
|
||||
oleg1973 |
|
|||
asm fanat Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: нет Всего: 34 |
вывод бегушей строки на экран в графическом режиме требует минимальных знаний о графических режимах, о формате пикселей, фонтов, и некоторых команд асма
-------------------- SST 465555 icq 200-512-712 |
|||
|
||||
dragon-gor |
|
|||
Новичок Профиль Группа: Участник Сообщений: 14 Регистрация: 13.1.2005 Репутация: нет Всего: нет |
Так где же её взять??? |
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Чуть позже опять положу. Это обычный паскаль 7.0 для DOS.
-------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
Payne |
|
|||
Детектив Профиль Группа: Участник Сообщений: 247 Регистрация: 6.4.2005 Где: Петербург Репутация: нет Всего: 10 |
Chingachguk: я недавно зарегистрировался, попал в этот топик - чуть не офигел! Первые три урока все было настолько понятно, просто до ужаса! Разобрался во всем. Вот четвертый - не понял. Точнее, многое не понял. Да и еще вопрос: почему уроков больше нет? Идет обсуждение всякой лабуды, словно нельзя для этого отдельную тему создать :-(. А тема-то все-таки называется "Асм - с чего начать?". Хотелось бы уроков.
|
|||
|
||||
Chingachguk |
|
||||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Насколько я помню, там была речь про прерывания. У меня не было цели добиться полного понимания того, что это такое и как с ним работать. Поскольку настоящее понимание возможно только с опытом. Там была мысль дать почуствовать - каково это, когда код выполняется нелинейно. Ну просто попробовать ;)
Я задавал этот вопрос, но никто особо не пожелал или не высказал ничего конкретного - чего бы ему хотелось. Собственно, далее по моему мнению должна идти практика. Берем задачку и решаем ее. Возможно, полностью не понимая того, что происходит. Но на принципах, изложенных в уроках 1-3. -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||
|
|||||
Payne |
|
||||
Детектив Профиль Группа: Участник Сообщений: 247 Регистрация: 6.4.2005 Где: Петербург Репутация: нет Всего: 10 |
Да, что правда, то правда.
Вот где-то после третьего урока все начали присылать коды с решениями заданий. Но эти коды были основаны не на тех циклах, которые юзались в уроке. Там фигурировала команда cld. Я так понял, что она увеличивает (уменьшает) значение счетчика (при организации циклов). Расскажи вкратце об этой команде, плз. |
||||
|
|||||
Chingachguk |
|
||||||||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Команда cld не влияет на счетчики циклов (обычно это регистры или ячейки памяти), команда влияет на флаг направления DF (direct flag) в регистре флагов процессора.
DF влияет на выполнение так называемых строковых команд movsb, cmpsb, scasb (movsw, cmpsw,...). Что такое строковые команды ? Это нечто вроде макрокоманды, но на уровне процессора, сделано для удобства программирования. Возьмем задачу пересылки блока данных (байт) из одной области памяти в другую:
С помощью строковых команд, в этом случае - movsb, мы можем упростить решение следующим образом:
Таким образом, одна команда movsb делает абсолютно то же, что делают 4 команды выше. Однако в результате выполнения movsb регистры si & di получили приращение, однако это произошло потому, что флаг направления DF был сброшен командой cld ! Если бы мы установили этот флаг командой std, то после выполнения movsb процессор бы уменьшил si & di на 1. Это может быть удобно в том случае, если копируются перкрывающиеся блоки данных. Если делать копирование вперед и с начала блока, то часть данных будет потеряна. Однако мы могли бы переписать копирование следующим образом:
Еще мы бы могли вообще обойтись без циклов и использовать префикс REP (повторять следующую команду CX раз):
-------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||||||
|
|||||||||
Payne |
|
|||
Детектив Профиль Группа: Участник Сообщений: 247 Регистрация: 6.4.2005 Где: Петербург Репутация: нет Всего: 10 |
Можно ли получить информацию о кодах сканирования клавиатуры, которые помещаются в регистр AH после нажатия клавиши во время прерывания
|
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Информация ниже взята из книги Зубкова С.В.
-------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
CnApTaK |
|
|||
Unregistered |
w32 инсталятор Turbo Pascal 7.0 for DOS
|
|||
|
||||
Гость_Начинающий |
|
|||
Unregistered |
(о первом уроке) А если мне надобно обращатся не к конкретному адресу?Как его загнать в переменную? Напр
упорно не хочет ставить точку.Где ошибка? |
|||
|
||||
oleg1973 |
|
|||
asm fanat Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: нет Всего: 34 |
mov ax,320*100+100
-------------------- SST 465555 icq 200-512-712 |
|||
|
||||
Гость_Начинающий |
|
|||
Unregistered |
Без разницы.
|
|||
|
||||
Lonley |
|
|||
Опытный Профиль Группа: Участник Сообщений: 597 Регистрация: 7.10.2003 Где: северные ворота М урманск Репутация: нет Всего: 4 |
-------------------- Земную жизнь пройдя до половины, Я очутился в сумрачном лесу, Утратив правый путь во тьме долины. Каков он был, о, как произнесу, Тот дикий лес, дремучий и грозящий, |
|||
|
||||
kdaemonv |
|
|||
Новичок Профиль Группа: Участник Сообщений: 24 Регистрация: 21.10.2005 Репутация: нет Всего: нет |
Chingachguk, подскажи.
Вот этот код я набираю в debug (система WinXP SP1):
Это аналог "самой короткой программы для выключения NumLock, CapsLock и ScrollLock" приведенной выше. После выполнения этого кода результата никакого - как горел NumLock так и горит. Это винда мне мешает изменять этот кусок памяти??? И если да, как она это делает и как мне с этим бороться??? |
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
Да, может быть что и винда. Попробуй загрузицца с дискеты в досе.
Нижеприведенный код точно работает в 98:
Это сообщение отредактировал(а) Chingachguk - 16.12.2005, 10:19 -------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
Гость_Merlin |
|
|||
Unregistered |
Народ помогите умоляю!!!!!!! Срочно нужна прога на чистом ассемблере (без паскаля) рисующая на экране небольшой круг и перемещающая его через некоторое время в рандомное положение. Пожалуйста кто может с комментариями. Вам же это раз плюнуть. Горю на допуске к экзамену!!!
Или если есть что-то подобное шлите на [email protected]. Буду бесконечно благодарен |
|||
|
||||
cardinal |
|
|||
Инженер Профиль Группа: Экс. модератор Сообщений: 6003 Регистрация: 26.3.2002 Где: Германия Репутация: 1 Всего: 99 |
Гость_Merlin, эта тему создана не для этого! Создай отдельную тему (в разделе "центр помощи" или "работа", если готов платить)!
-------------------- Немецкая оппозиция потребовала упростить натурализацию иммигрантов В моем блоге: Разные истории из жизни в Германии "Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино". А. и Б. Стругацкие |
|||
|
||||
ctranik |
|
|||
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 25.12.2005 Репутация: нет Всего: нет |
neutrino, привет
А где можго скачать эту книгу "Programmirovanie v Turbo Assembler" И кстати перевод на русский имеется ? |
|||
|
||||
peter789 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 19.3.2006 Репутация: нет Всего: нет |
поиск файла по маске
|
|||
|
||||
oleg1973 |
|
|||
asm fanat Профиль Группа: Экс. модератор Сообщений: 3283 Регистрация: 16.7.2003 Где: Italy Репутация: нет Всего: 34 |
peter789,
os какая? -------------------- SST 465555 icq 200-512-712 |
|||
|
||||
darthnick |
|
|||
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 3.5.2006 Репутация: нет Всего: нет |
привет, я только начал асм изучать и возник вопрос.. к примеру:
somevar dw 0 ; ... mov ax,23 mov [somevar],ax ;... почему в последней строчки испл. [] ? ведь компилируется без них нормально и непрямая адресация не испл. З.Ы. сорри если не по теме Это сообщение отредактировал(а) darthnick - 12.6.2006, 13:03 |
|||
|
||||
Chingachguk |
|
|||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
В данном случае все равно, как писать. Лично мне больше нравится mov word ptr SomeVar[...],ax например - mov word ptr SomeVar[bx+di],ax и т.п.
-------------------- I don't like the drugs (but the drugs like me). M.Manson. |
|||
|
||||
daniel |
|
|||
Новичок Профиль Группа: Участник Сообщений: 1 Регистрация: 13.6.2006 Репутация: нет Всего: нет |
Огромное спасибо за уроки!
Расскажите пожалуйста побольше о циклах! |
|||
|
||||
setty |
|
|||
Шустрый Профиль Группа: Участник Сообщений: 66 Регистрация: 8.6.2006 Где: Украина Репутация: нет Всего: нет |
в книгах же все расписано хорошо
есть несколько видов loop ов можно циклы устраивать последовательностью cmp/test и jne/je |
|||
|
||||
Chingachguk |
|
||||||||
Эксперт Профиль Группа: Участник Клуба Сообщений: 1232 Регистрация: 25.3.2002 Где: Москва Репутация: 11 Всего: 18 |
daniel
Спасибо ;) Циклы... ранее я писал ориентируясь на то, что изучающий будет использовать вставки на языке Паскаль для DOS. Времена меняются... возможно, будет лучше использовать вставки на языке Делфи или СИ (VC6). Пусть это будет язык Делфи. Здесь программа - WIN32 приложение, никаких сегментов больше нет (почти нет, но бывают иногда). Все указатели на любые данные или параметры в большинстве случаев - 32 битные значения. Используются 32-х разрядные регистры: EAX (ранее был AX/AL), EBX, ECX, EDX, ESI, EDI, EBP. Регистры EBX, ESI, EDI лучше сохранять. Предполагаем простую задачу: программа принимает указатель на массив байт и размер самого массива и ищет в нем заданный байт. Если находит, то возвращает номер байта (нумерация от 1), иначе возвращает 0:
Надо сказать, что код выше я не проверял ;) Главное - попробовать самому его использовать, может быть даже модифицировать. Также на тему циклов. В свое время я был участником одного соревнования по написанию программки с максимально коротким размером. Задача была в следующем: - Написать программу под DOS, com-файл с максимально коротким размером; - Получить время от DOS следующим образом:
- После этого вывести текущее время на экран в формате: HH:MM:SS. Например, если время сейчас 23 часа 24 минуты 25 секунд, то на экране будет 23:24:25 Ниже мой пример. Попробуй разобрать его и понять как он работает. Там есть несколько циклов.
Добавлено @ 00:20 Мда, int 29h - это вывод байта на консоль (экран):
-------------------- I don't like the drugs (but the drugs like me). M.Manson. |
||||||||
|
|||||||||
nerezus |
|
|||
Вселенский отказник Профиль Группа: Участник Сообщений: 3330 Регистрация: 15.6.2005 Репутация: нет Всего: 43 |
А ссылочку на справочни по коммандам можно? Учебники не нужны =(
|
|||
|
||||
Роман |
|
|||
Опытный Профиль Группа: Участник Сообщений: 279 Регистрация: 9.7.2006 Репутация: нет Всего: 1 |
Да, не помешал бы справочник по asm-командам, особенно электронный и оперативный! Чтобы можно было найти описание конкретной команды, а также быстро подобрать команду из определенной категории.
-------------------- Жизнь - это последствия от последствий. |
|||
|
||||
Damarus |
|
|||
Опытный Профиль Группа: Awaiting Authorisation Сообщений: 671 Регистрация: 6.5.2006 Репутация: нет Всего: 29 |
Intel® 64 and IA-32 Architectures Software Developer's Manuals |
|||
|
||||
Snik |
|
|||
Бывалый Профиль Группа: Участник Сообщений: 174 Регистрация: 16.8.2006 Репутация: нет Всего: нет |
Привет!
Очень хорошо подан матерьял, а можно гдето в подобном стиле изложения поучиться для чистого assembler(a) , а точнее Turbo Assembler Version 4.1 Copyright © 1988, 1996 Borland International |
|||
|
||||
Роман |
|
|||
Опытный Профиль Группа: Участник Сообщений: 279 Регистрация: 9.7.2006 Репутация: нет Всего: 1 |
Intel® 64 and IA-32 Architectures Software Developer's Manuals - вещь конечно хорошая, но хочется чего-нибудь на русском языке!
-------------------- Жизнь - это последствия от последствий. |
|||
|
||||
Роман |
|
|||
Опытный Профиль Группа: Участник Сообщений: 279 Регистрация: 9.7.2006 Репутация: нет Всего: 1 |
Вот нашел интересную ссылку по теме: http://vas-unn.narod.ru/
Вот еще: http://212.176.41.3:777/archive/66/38978/asm-abc.zip (25КБ) Но нужно искать дальше! Это сообщение отредактировал(а) Роман - 21.11.2006, 16:53 -------------------- Жизнь - это последствия от последствий. |
|||
|
||||
mr666 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 28.3.2006 Репутация: нет Всего: нет |
Я вот только начал вникать в ассемблер. Читаю калашникова, возник вопрос,
mov es: [di],ax Не пойму что за [], толи они напрямую пишут по адресу, что тоневъеду никак. |
|||
|
||||
Shaggie |
|
|||
Опытный Профиль Группа: Завсегдатай Сообщений: 570 Регистрация: 21.12.2006 Где: outer space Репутация: нет Всего: 72 |
mr666, все правильно. Значение, содержащееся в регистре ax, пишется не в сам регистр di, а по адресу, содержащемуся в нем.
Если в ax лежит 005E, а в di лежит 27B3, то значение регистра di не изменится, а значение ячейки памяти по адресу es:27B3 станет равным 005Е Это сообщение отредактировал(а) Shaggie - 15.2.2007, 16:19 |
|||
|
||||
mr666 |
|
|||
Новичок Профиль Группа: Участник Сообщений: 42 Регистрация: 28.3.2006 Репутация: нет Всего: нет |
Shaggie,
там вроде es (сигментный регистр) а что значит [di] di это вроде указатель. Запутался я. |
|||
|
||||
Shaggie |
|
|||
Опытный Профиль Группа: Завсегдатай Сообщений: 570 Регистрация: 21.12.2006 Где: outer space Репутация: нет Всего: 72 |
mr666, ой, прошу простить, это я виноват - запутал. Щас поправлю.
Регистр di используется в основном как указатель на ту область памяти, в которую мы будем писать информацию. Когда регистр берется в квадратные скобки [], то этим мы указываем процессору писать (или читать) информацию не в сам регистр, а по адресу памяти, которое содержится в этом регистре.
Это сообщение отредактировал(а) Shaggie - 15.2.2007, 16:26 |
|||
|
||||
MAKCim |
|
|||
Воін дZэна Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 1 Всего: 207 |
в реальном режиме эквивалентно записи слова из регистра AX по абсолютному адресу 'слово в ES << 4 + слово в DI' -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
Правила форума "Asm для начинающих" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Asm для начинающих | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |