|
29.05.2013, 11:38 | |
Ответы с готовыми решениями:
65
Организация тем в разделе Assembler, MASM, TASM Полезные макросы для MASM и TASM Видеоуроки по Ассемблеру MASM/TASM (для DOS) на русском языке MASM, TASM, FASM: что выбрать для программирования в ядре |
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
29.05.2013, 19:16 | 2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Написать программу, выводящую строку "Hello, World!" на экран
извини, что воспользовался твоим топиком, но первое сообщение в топике будет таскаться за ним во всех страницах
5
|
Эксперт быдлокодинга
2091 / 525 / 69
Регистрация: 04.11.2010
Сообщений: 1,310
|
||||||
29.05.2013, 19:22 | 3 | |||||
Вывод спирали на экран в DOS Теория Архимедова спираль — спираль, плоская кривая, траектория точки M, которая равномерно движется вдоль луча OV с началом в O, в то время как сам луч OV равномерно вращается вокруг O. Другими словами, расстояние Уравнение Архимедовой спирали в полярной системе координат записывается так: Повороту прямой на При вращении луча против часовой стрелки получается правая спираль, при вращении — по часовой стрелке — левая спираль. Обе ветви спирали (правая и левая) описываются одним уравнением (1). Положительным значениям Луч OV, проведенный из начальной точки O, пересекает спираль бесконечное число раз — точки B, M, A и так далее. Расстояния между точками B и M, M и A равны шагу спирали Практика Две пересекающиеся спирали. X и Y рассчитываются по формулам:
4
|
Ушел с форума
![]() 15840 / 7422 / 994
Регистрация: 11.11.2010
Сообщений: 13,385
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
30.05.2013, 05:04 [ТС] | 4 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Синус на ассемблере Вычислить синус на ассемблере можно несколькими способами, выбирайте тот, который вам больше подходит:
3
|
Ушел с форума
![]() 15840 / 7422 / 994
Регистрация: 11.11.2010
Сообщений: 13,385
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
30.05.2013, 06:06 [ТС] | 5 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
DEBUG.EXE взято здесьстатья winsoft Стандартный отладчик debug.exe, входит в любую версию DOS/Windows. debug.exe прост, доступен и подходит для начинающих программистов на языке Ассемблер. Для запуска debug.exe заходим в Пуск->Выполнить и набираем команду debug. Команды debug.exe Для начала разберемся с правилами набора команд debug.exe:
Разобравшись с правилами, переходим к изучению команд debug.exe. Замечу, что работа с командами debug.exe в чем-то похожа на работу с командной строкой DOS. После загрузки отладчика на экране появится приглашение, выглядящее в виде дефиса: Код
-_ Команды debug.exe вводятся сразу после приглашения на месте, которое отмечено курсором. Каждая команда состоит из идентификатора и параметров, идентификатор состоит из одной буквы. таблица команд debug.exe
Просмотр областей памяти В этой части рассмотрена работа команды D, позволяющей просматривать содержимое отдельных областей памяти.Этот пример использует команду D для просмотра области памяти, начиная с 0159:0240: Код
-d 0159:0240 0159:0240 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........l..... 0159:0250 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0159:0260 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0159:0270 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 0159:0280 00 00 00 00 00 00 00 00-00 FF FF FF FF 00 00 00 ................ 0159:0290 FF 00 00 00 00 00 00 00-00 00 4E 4F 20 4E 41 4D ..........NO NAM 0159:02A0 45 20 20 20 20 00 26 81-4F 03 00 01 CB 00 00 00 E .&.O....... 0159:02B0 00 00 00 00 00 00 00 00-00 00 00 01 07 04 FF 02 ................ -_
Адрес, указанный в строке, относится исключительно к первому байту в параграфе, а адреса последующих байтов следует вычислять самостоятельно. Шестнадцатеричное представление содержит по два знака в каждом байте, а сами байты разделены пробелами для облегчения чтения. Кроме того, следует отметить, что восьмой и девятый байты разделены дефисом, разделяя тем самым параграф на две части и облегчая вычисление адресов байтов в параграфе. Полезные приемы с командой D
Непосредственный ввод программы в память с помощью debug.exe debug.exe позволяет вводить программу непосредственно в память машины, а затем следить и управлять ее выполнением. Мы будем вводить программу в машинных кодах, используя команду E. При этом будьте бдительны - ввод ошибочных данных по ошибочному адресу чреват непредсказуемыми последствиями! Хотя к серьезным проблемам в системе это вряд ли приведет, но потерять все данные, введенные в debug.exe, можно потерять запросто.Программа, которую мы сейчас будем вводить, использует данные, заложенные непосредственно в теле инструкций. Далее показан листинг программы на Ассемблере, в комментариях указаны аналоги команд языка в машинных кодах, а также объяснение каждой команды. Замечу, что в числах нет символа h, поскольку, как было сказано выше, debug.exe понимает только числа в шестнадцатеричной системе. Код
MOV AX, 0123 ; код B82301: заносим значение 0123h в AX ADD AX, 0025 ; код 052500: прибавляем 0225h к значению AX MOV BX, AX ; код 8BD8: заносим значение AX в BX ADD BX, AX ; код 03D8: прибавляем значение AX к BX MOV CX, BX ; код 8BCB: заносим значение BX в CX SUB CX, AX ; код 2BC8: отнимаем значение AX из CX SUB AX, AX ; код 2BC0: очищаем AX JMP 100 ; код EBEE: переходим к началу программы Теперь можно ввести программу в память. Разделим машинный код на три части по шесть байт и введем каждую, используя команду E и начиная с адреса CS:100. Код
-E CS:100 B8 23 01 05 25 00 -E CS:106 8B D8 03 D8 8B CB -E CS:10C 2B C8 2B C0 EB EE -_ Код
-r AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=15D7 ES=15D7 SS=15D7 CS=15D7 IP=0100 NV UP EI PL NZ NA PO NC 15D7:0100 B82301 MOV AX,0123 -_ Здесь же указаны и значения флагов переполнения, направления, прерывания, знака, нуля, дополнительного переноса, четности и переноса:
После этого debug.exe снова выводит информацию о регистрах: Код
-t AX=0123 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=15D7 ES=15D7 SS=15D7 CS=15D7 IP=0103 NV UP EI PL NZ NA PO NC 15D7:0100 B82301 ADD AX,0025 -_ Так, раз за разом выполняя команду T, мы дойдем до последней инструкции JMP 100. Она установит регистр IP в 100h, и debug.exe вернется к началу программы. Возвращаясь к началу программы, следует заметить, что в DS, ES, SS и CS содержится один и тот же адрес. Дело в том, что debug.exe рассматривает введенные программы исключительно как программы .COM. А в программах .COM, в отличие от .EXE, стек, код и данные хранятся в одном сегменте. Ассемблирование и дизассемблирование В прошлом примере мы вводили программу в машинных кодах, однако, debug.exe вполне способен понимать инструкции, записанные на ассемблере. Для работы с такими программами в debug.exe используются команды A и U.Команда A запрашивает инструкции на ассемблере и преобразовывает их в машинный код. Для начала инициализируем начальный адрес для ввода инструкций (100h): Код
-a 100_ Код
MOV CL, 42 MOV DL, 2A ADD CL, DL JMP 100 Перейдем к процедуре дизассемблирования, а в качестве примера возьмем только что введенную программу. Используем адреса первой и последней инструкций для указания диапазона, который мы собираемся дизассемблировать, т.е. 100h и 107h. Код
-u 100, 107_ Код
13F2:0100 B142 MOV CL, 42 13F2:0102 B22A MOV DL, 2A 13F2:0104 00D1 ADD CL, DL 13F2:0106 EBF8 JMP 0100 Итог А теперь, после небольшого обзора возможностей стандартного отладчика debug.exe давайте подведем итоги. Итак:
Фрагменты из статьи "низкоуровневое программирование для дZенствующих - DZebug: руководство юZверя"
Фрагменты статей Рустэма Галеева aka Roustem взято здесьWin32 в машинных кодах Инструменты Чтобы вводить двоичные значения в компьютер, необходим шестнадцатеричный редактор. Поскольку мы решили обходиться стандартными средствами, имеющимися в любой типичной поставке Windows, используем в качестве шестнадцатеричного редактора старый досовский отладчик debug. Рассмотрим лишь те возможности этого отладчика, которые нам понадобятся в работе. Сначала имеет смысл создать отдельную папку для проводимых экспериментов, например, \exp. Теперь запустим командную строку DOS, перейдем в созданный каталог (cd \exp) и наберем: debug. Появляется черточка - приглашение отладчка; можно набирать команды. Сразу о том, как завершить работу debug: для этого служит команда q (quit). Debug позволяет создавать и записывать на диск файлы, но у этого процесса есть некоторые особенности. Дело в том, что создаваемые файлы будут в старом досовском формате com. Для нас это означает, что при записи на диск отладчик использует данные, начиная со смещения 100h кодового сегмента (адрес которого содержится в регистре CS), это надо учитывать. Если наши данные будут начинаться со смещения 0, первые 256 (100h) байтов окажутся утерянными (для содержимого регистров CS и DS по умолчанию). Либо надо вручную изменить (увеличить на 10h) значение регистра DS. Попробуем создать простейший файл. Запускаем debug. Для записи служит команда w (write); однако вначале должно быть определено имя файла с помощью команды n (name). В принципе, имя может быть любым досовским именем (в коротком формате 8.3), но расширение не может быть exe или hex. Лучше использовать расширение bin, а потом переименовать файл. Набираем: Код
n first.bin Код
r cx 1 Перейдем к формированию наших данных. Одна из полезных команд - f (fill), она позволяет заполнить участок памяти указанными данными. После f первым параметром идет смещение (начальный адрес) заполняемого блока, затем либо параметр l (length) и число, указывающее на длину заполняемого участка в байтах, либо смещение его конца. После этого - собственно данные, которыми будет заполняться данный участок. Причем данные могут быть как в виде 16-ричных чисел, так и в виде заключенных в апострофы или кавычки строк, причем их можно чередовать. Например, заполним первые 256 (100h) байт строкой "This is the filling string": Код
f 0 l 100 'This is the filling string' Код
d 0 ff Код
f 0 400 0 Код
d 0 Теперь проделаем эксперимент, демонстрирующий особенность сохранения файлов в debug. Создадим файл, первые 100h байт которого заполнены символами '0', вторые 100h байт - символами '1' и т.д. до, скажем, '9'. Дадим файлу имя 'first.txt' (или любое другое с расширением .txt), а размер его будет a00h (2,5 Кб). Код
n first.txt r cx a00 f 0 l 100 30 f 100 l 100 31 Открываем 'first.txt' в Блокноте. Но что это? Файл начинается с единиц, а в конце какой-то мусор? Смотрим в debug'е: d 0 ff - все нормально, заполнено цифрами 0 (30h). Вот это и есть та особенность отладчика, о которой мы говорили в начале. В файл записываются данные начиная со смещения 100h относительно кодового сегмента. Исправить эту ситуацию можно попытаться двумя способами. Рассмотрим еще одну команду отладчика: m (move). Она позволяет копировать данные из одной области памяти в другую. Первый параметр, как и ранее, является смещением начала участка памяти, который необходимо скопировать, второй - либо смещением конца копируемого участка, либо (при наличии буквы l) его длиной, третий параметр - смещение места назначения, куда надо скопировать данные. С помощью этой команды мы можем "передвинуть" весь наш блок данных так, чтобы он начинался со смещения 100h: Код
m 0 l a00 100 Второй способ - изменить значение регистра сегмента данных DS таким образом, чтобы он указывал на область со смещением 100h относительно начала кодового сегмента. Т.е. надо просто добавить к старому значению DS 10h. Допустим, в DS было значение 2020. Изменим его на 2030: Код
r ds 2030 Код
f 0 l a00 ff Код
f 0 l 100 30 f 100 l 100 31 ... f 900 l 100 39 w Команда e (enter) позволяет вводить данные по конкретным адресам. Первый параметр указывает начальный адрес, остальные рассматриваются как данные для ввода. Причем здесь тоже можно использовать как 16-ричные числа, так и символьные строки, чередуя их между собой произвольным образом. В связи с данной командой рассмотрим особенность процессоров IA-32, о которой говорилось в прошлой статье. Речь идет об "обратном" представлении чисел в памяти; хотя по внимательном рассмотрении этого вопроса представление чисел в процессорах IA-32 как раз является естественным ("нормальным"), а "обратным" оказывается наша традиционная запись. Попробуем разобраться. Мы читаем и записываем слева направо. Если записать порядковые номера, они будут увеличиваться тоже слева направо. Естественно таким же образом нумеровать объекты, скажем, байты памяти: 1, 2, 3, 4 и т.д. Значения возрастают слева направо. Теперь посмотрите на числа, у которых увеличиваются разряды: 1, 10, 100, 1000. Каждый новый разряд мы добавляем слева, т.е. возрастание числа получается справа налево - порядок, противоположный традиционному письму. Если сохранять в памяти текст, т.е. строку символов, при добавлении новых символов они будут помещаться "правее", т.е. по возрастающим адресам памяти (поскольку мы нумеруем их слева направо). А как быть, если увеличивается значение числа и оно перестает помещаться на старом месте? Скажем, вместо байта требуется уже слово (два байта)? Новый байт можно добавить "слева" (с меньшим адресом) или "справа" (с большим адресом). Поскольку адресом многобайтной конструкции по соглашению считают самый младший адрес, он может указывать либо на байт, в котором хранятся старшие разряды числа, либо на байт, в котором хранятся младшие разряды. Первый способ называется "big-endian", второй - "little-endian". Так вот, в процессорах IA-32 используется "little-endian", т.е. старшие разряды добавляются "справа" (по старшим адресам памяти) - порядок, обратный нашей записи чисел. Говорят, в свое время Фибоначчи, заимствуя цифры у арабов, не учел особенностей их письма: арабы пишут справа налево, в отличие от нас. И так же располагались разряды их цифр. Фибоначчи использовал тот же порядок, хотя европейцы писали в обратном направлении - вот где корень всех наших бед ![]() Таким образом, если мы хотим разместить по адресу 10h число 12h, мы набираем: Код
e 10 12 Код
e 10 34 12 Код
e 10 78 56 34 12 Как вы уже, очевидно, заметили, в 16-разрядной системе используется сегментная модель памяти. Это создает дополнительные проблемы; в частности, команды заполнения (f) и перемещения (m) не работают через границы сегментов. Поэтому, хотя debug в принципе позволяет сохранять файлы размером более одного 16-разрядного сегмента (64 Кб), при составлении таких файлов у нас могут возникнуть проблемы. Их можно решить другим путем - собирая в debug отдельные "модули", не превышающие 64 Кб, и соединяя их с помощью команды DOS copy. Для доказательства такой возможности соберем простой текстовый файл размером в 1 Мб. Собирать будем из 16 модулей в 64 Кб, сохраненных средствами debug; каждый модуль будет заполнен единственным символом - 16-ричной цифрой, значение которой равно номеру модуля (для контроля). Сначала настроим регистр DS (если он не был настроен ранее), увеличив его значение на 10h. В регистр CX должно быть значение 0, в BX - 1 (это соответствует размеру файла 10000h байт, или ровно 64 Кб): Код
r ds <ввести значение на 10h большее прежнего> r cx 0 r bx 1 Код
n 0.bin f 0 l 0 30 w n 1.bin f 0 l 0 31 w . . . n 15.bin f 0 l 0 46 w Код
copy /b 0.bin+1.bin+2.bin+3.bin+...+15.bin 16.txt Осталось рассмотреть лишь некоторые методы автоматизации нашей работы. Работать с debug, все время вводя данные в интерактивном режиме, может оказаться утомительным - удобнее использовать заранее подготовленные шаблоны, внося в них каждый раз небольшие изменения. Для этого воспользуемся еще одной возможностью ОС - перенаправлением ввода-вывода. Все необходимые команды для debug записываются в текстовый файл, который затем подается на вход отладчика при его запуске следующим образом: debug < batch.txt Для испытания этого способа повторим тот же алгоритм, который мы использовали при создании файла "first.txt". В Блокноте создаем файл "batch.txt" со следующим содержимым: Код
n first.txt r cx a00 f 0 l 100 30 f 100 l 100 31 . . . f 900 l 100 39 m 0 l a00 100 w q Код
debug < batch.txt > batch.lst Наконец, рассмотрим еще одну команду - a (assemble). Эта команда позволяет войти в режим ассемблирования, т.е. ввода инструкций на ассемблере, которые debug автоматически преобразует в машинные коды. Однако делает это он в 16-разрядном режиме, что нам совершенно не подходит. Но мы можем воспользоваться в этом режиме директивой db, позволяющей вводить отдельные байты, как в команде e. Это может напомнить путешествие из Петербурга в Москву через Владивосток; однако, удобство этого метода в том, что отладчик будет автоматически подсчитывать смещение следующей вводимой инструкции (в нашем случае - байта), и можно не считать все самим. Параметром команды a является адрес (смещение), с которого мы начинаем вводить инструкции. Чтобы выйти из режима ассемблирования, необходимо просто нажать 'Enter' еще раз (в тексте пакетного файла в этом месте должна быть пустая строка). Потренируемся в использовании этой команды с использованием инструкций в машинных кодах, которые мы составляли в прошлый раз (впрочем, ничто не мешает составить и новые). Сначала поработаем в интерактивном режиме: Код
a 100 Код
db b8 01 00 00 00 Код
; конец инструкции Код
db b4 01 ; конец второй инструкции db "Some text" Код
<Enter> n second.bin r cx 10 w Но преимущества режима ассемблирования станут очевидными при работе с перенаправлениями. Создадим файл "second.txt" и наберем в нем те же данные (не забыв про пустую строку в соответствующем месте и команду q в конце). В командной строке DOS запишем: Код
debug < second.txt > second.lst Завершим знакомство с отладчиком способами загрузки созданных заранее шаблонов. Для загрузки файлов служит команда L (Load). При этом имя файла должно быть уже указано командой n. Файл загружается по смещению 100h. Либо имя файла можно указать в качестве параметра при вызове отладчика: Код
debug first.txt Для примера рассмотрим, как можно загрузить в качестве шаблона созданный ранее файл "first.txt" и сохранить его после сделанных изменений. Сначала создаем "автоматизирующий" файл с командами ("third.txt"): Код
n third.bin m 100 l a00 0 f 100 l 100 ff m 0 l a00 100 w q Код
debug first.txt < third.txt > third.lst Финальный штрих - полная автоматизация создания исполняемого файла. Для этого создается bat-файл, в котором записываются вызов самого debug, а также другие необходимые действия, например, составление одного большого файла из отдельных модулей с помощью команды copy или переименование файла с расширением bin в файл с расширением exe. Создадим в Блокноте файл "make.bat": Код
@echo off debug < second.txt ren second.bin second.exe Код
debug < second.txt > nul Каков же итог? Любой файл - будь то картинка, векторная или трехмерная графика, музыка, видео или исполняемый - это всего лишь сохраненный набор двоичных чисел. А итог таков, что мы умеем теперь создавать файлы практически любого размера и с любым содержанием. Единственное, что при этом надо - это изучить формат соответствующего типа файла. Этим мы и займемся в следующей статье применительно к исполняемым файлам Windows.
12
|
Ушел с форума
![]() 15840 / 7422 / 994
Регистрация: 11.11.2010
Сообщений: 13,385
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
30.05.2013, 10:22 [ТС] | 6 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Исполняемые файлы Windows Как сделать, чтобы программа заработала? Работа приложения начинается с того, что операционная система создает процесс. Это не просто загруженная в память программа пользователя; процесс предполагает создание множества внутренних системных структур для обеспечения работы программы и предоставления ей различных ресурсов, таких как память, процессорное время, доступ к установленному в системе оборудованию и так далее.Важнейшим ресурсом являетcя виртуальная память. Каждый процесс получает в свое распоряжение собственное виртуальное адресное пространство памяти размером 4 Гб. Это значит, что он может обращаться по любому из адресов памяти от 0 до FFFFFFFFh. Но это значит также и то, что различные процессы могут использовать одни и те же адреса, не мешая друг другу. Система работает с памятью в виде блоков фиксированного размера, называемых страницами (обычно по 4 Кб; на современных процессорах могут быть страницы также по 2 Мб) и использует страничную переадресацию для отображения одних и тех же виртуальных адресов различных процессов в разные области физической памяти. Кроме того, при недостатке физической памяти временно неиспользуемые данные могут сохраняться на диске, освобождая физическую память для других виртуальных адресов (это называется подкачкой). В адресном пространстве процесса резервируются области для динамически выделяемой памяти ("кучи") и стека (о нем мы подробнее поговорим в следующей статье). Затем образ программы загружается из файла на диск по базовому адресу загрузки. Образ программы состоит из одной или нескольких секций. Для каждой секции выделяется несколько страниц памяти, имеющих одинаковые атрибуты. Например, это могут быть исполняемые страницы, страницы только для чтения или для чтения и записи. Это сделано для уменьшения количества возможных ошибок; например, случайный запуск на исполнение страницы, содержащей не код, а данные, может привести к непредсказуемым результатом. Если же в атрибутах страницы не указана возможность исполнения, это приведет к сообщению об ошибке. Точно так же атрибут "только для чтения" позволяет перехватить попытку случайной или преднамеренной записи на страницу, содержание которой не должно изменяться (допустим, если она содержит константы). Расширение "exe" осталось в наследство от старых DOS-овских исполняемых (executable) файлов. Используемый в настоящее время формат исполняемых файлов Windows называется "Portable Executable" (PE), поскольку один и тот же формат используется для разных платформ. Более того, он построен на основе шаблонов, являющихся общими и для объектных файлов формата COFF (используемых в том числе в мире Unix), а также построенных на их основе библиотечных файлов и файлов импорта (.lib). Формат PE в системе Win32 является универсальным: его используют не только исполняемые файлы (exe), но и динамические библиотеки (dll) и их особые разновидности -элементы ActiveX (ocx) и системные драйверы (sys и drv). Как и старый формат exe для DOS, PE-файл состоит из заголовка и собственно образа исполняемой программы. Образ программы, как уже отмечалось, может быть составлен из одной или нескольких секций. Заголовок же можно условно разделить на "старый" (DOS-заголовок и DOS-стаб) и "новый" (все остальное) "Новый" заголовок составлен из собственно PE-заголовка и таблицы секций, которая фактически является картой отображения записанных в файле секций образа программы в память. В PE-заголовке выделяют также несколько составных частей, но для нашего рассмотрения они несущественны. Отметим лишь каталог смещений-размеров, который указывает на расположение и размеры специальных служебных таблиц. Для размещения последних могут быть выделены отдельные секции в образе программы, но это не является обязательным; в принципе, для всей программы можно использовать одну единственную секцию, разместив в ней и данные, и код, и все необходимые вспомогательные структуры. Теперь рассмотрим все подробнее. Поскольку попытка запуска создаваемых нами программ под DOS маловероятна, можно без особых проблем обойтись без программы-заглушки DOS. PE-заголовок в этом случае будет следовать сразу за старым заголовком DOS, а именно - непосредственно после 4-байтного поля со смещением 3Ch, то есть по смещению 40h (само поле 3Ch будет содержать в данном случае это же значение). Единственное, что нужно еще оставить в старом заголовке - это сигнатуру в виде 2 ASCII-символов 'MZ' в начале файла (байты 4Dh 5Ah). Остальные поля могут содержать нули - загрузчик Windows их не использует. Поля PE-заголовка приведены в таблице 1. Смещения указаны относительно начала заголовка, а жирным шрифтом выделены те поля, при неверных значениях которых Windows откажется загружать программу. Остальные поля либо содержат необязательные данные (например, указатель на размещение и размер отладочных данных), либо для них предусмотрены значения по умолчанию (как для размеров кучи и стека), либо используются лишь для определенных видов файлов (например, флаги dll или контрольная сумма). Таблица 1. PE-заголовок
Таблица секций следует непосредственно после PE-заголовка (после каталога смещений). Каждый вход таблицы имееет следующий формат (см. табл. 2). Таблица 2. Строка таблицы секций
Секция может содержать т.н. неинициализированные данные. Фактически, это просто резервирование определенных адресов памяти под будущие переменные. Для таких данных место в файле не отводится; память резервируется лишь при загрузке на исполнение. Если вся секция содержит лишь неинициализированные данные, поля размера данных секции в файле и смещения начала данных секции в файле равны нулю. В любом случае, когда размер секции в файле меньше указанного размера секции в памяти, остаток заполняется до нужного размера нулями. Поле флагов секции - то самое, где задаются атрибуты страниц памяти, отводимых под секцию. Возможно использование до 32 флагов (по одному на каждый бит 4-байтного значения), но часть из них зарезервирована, другая часть используется лишь в объектных файлах. Биты нумеруются от младшего к старшему, начиная от 0 (самый младший бит - 0, самый старший - 31). Наиболее употребительные для исполняемых файлов следующие:
Код
01100000 00000000 00000000 00100000 (60 00 00 20 h) Код
11000000 00000000 00000000 01000000 (C0 00 00 40 h) Код
01000000 00000000 00000000 01000000 (40 00 00 40 h) Секции исполняемого файла Следующей будет секция с данными только для чтения; назовем ее '.rdata'. Она будет расположена в файле по смещению 400h, а в памяти - по смещению 2000h. Флаги: 40000040h. За ней - секция данных с разрешениями на чтение и запись: '.data', расположение в файле - 600h, в памяти - 3000h; флаги: C0000040h.Теперь составим командный файл для отладчика debug. Имеет смысл сначала создать специальную папку "Шаблоны". В ней сохраним этот файл для использования в дальнейшем. Открываем Блокнот и набираем: Код
n Header.bin r cx 200 f 0 l 200 0 e 0 'MZ' e 3C 40 e 40 'PE' e 44 4C 01 А вот дальше пойдут поля PE-заголовка, которые нужно будет настраивать для каждого отдельного exe-файла. Чтобы было удобнее редактировать этот файл в дальнейшем, оставим здесь комментарии - а для этого нам придется изменить способ ввода и перейти в режим ассемблирования. Код
a 46 ; Здесь должно быть число секций (2 байта) ***** db 03 00 <пустая строка> Имеет смысл также выделить те участки, которые нужно будет в дальнейшем редактировать (как этот случай - число секций может каждый раз быть разным); для этого удобно выделять каким-либо способом строку с комментарием, чтобы она сразу бросалась в глаза. Оставшуюся часть файла для debug приведем, как есть; она не должна вызвать проблем (обратите внимание на пустые строки - их нельзя удалять; и помните про обратный порядок байтов в числах, требующих более 1 байта): Код
a 54 ; Размер дополнительного заголовка db e0 00 ; Тип файла db 0F 01 ; "Магическое" значение db 0B 01 a 68 ; Здесь должно быть смещение точки входа ; относительно адреса загрузки (4 байта) ***** db 00 10 00 00 a 74 ; Начальный адрес загрузки (4 байта) ***** db 00 00 40 00 ; Выравнивание секций (4 байта) db 00 10 00 00 ; Выравнивание в файле (4 байта) db 00 02 00 00 ; Старшая версия Windows (2 байта) db 04 00 a 88 ; Старшая версия подсистемы (2 байта) db 04 00 a 90 ; Здесь должен быть размер загруженного файла ; в памяти (4 байта) ***** db 00 40 00 00 ; Размер всех заголовков в файле (4 байта) db 00 02 00 00 a 9C ; Подсистема: 02 - графическая, 03 - консольная (2 байта) db 02 00 a A0 ; Зарезервированный размер стека (4 байта) db 00 00 10 00 ; Выделенный размер стека (4 байта) db 00 10 00 00 ; Зарезервированный размер кучи (4 байта) db 00 00 10 00 ; Выделенный размер кучи (4 байта) db 00 10 00 00 a B4 ; Число элементов каталога смещений (4 байта) db 10 00 00 00 ;************ ; Здесь начинается первый элемент каталога: ; но у нас пока ничего нет - оставляем нули a 138 ; Начало таблицы секций ; ; имя первой секции (8 символов) db '.code' 0 0 0 ; размер секции в памяти (4 байта) db 00 10 00 00 ; смещение секции относительно адреса загрузки (4 байта) db 00 10 00 00 ; размер данных секции в файле (4 байта) db 00 02 00 00 ; смещение начала данных секции в файле (4 байта) db 00 02 00 00 ; Пропускаем 12 байтов db 0 0 0 0 0 0 0 0 0 0 0 0 ; атрибуты первой секции (4 байта): ; код, разрешено исполнение и чтение db 20 00 00 60 ; ; данные второй секции - аналогично: db '.rdata' 0 0 db 00 10 00 00 db 00 20 00 00 db 00 02 00 00 db 00 04 00 00 db 0 0 0 0 0 0 0 0 0 0 0 0 db 40 00 00 40 ; ; данные третьей секции db '.data' 0 0 0 db 00 10 00 00 db 00 30 00 00 db 00 02 00 00 db 00 06 00 00 db 0 0 0 0 0 0 0 0 0 0 0 0 db 40 00 00 C0 m 0 l 200 100 w q Теперь у нас есть шаблон, который можно вставлять в начало exe-файла с 3 секциями, размеры которых не превышают 200h байт каждая. Чтобы протестировать его, нужно собрать "настоящий" exe-файл с его использованием. Для этого немного схитрим: вставим две пустые секции (содержащие лишь нули) в качестве секций данных; а в секции кода используем всего 2 байта: EB FE. Это инструкция, передающая управление на себя (как мы узнаем в дальнейшем). Т.е. наша программа просто зацикливается; но пока нам большего и не надо. В блокноте создадим еще 2 простых файла. Первый - "s1.txt" (содержит наш "код"): Код
n s1.bin r cx 200 f 100 l 200 0 e 100 eb fe w q Код
n s2.bin r cx 200 f 100 l 200 0 w q Код
@echo off debug < header.txt > report.lst debug < s1.txt >> report.lst debug < s2.txt >> report.lst copy /b header.bin+s1.bin+s2.bin+s2.bin nil.exe Второй вызов debug исполняет команды в файле s1.txt, создавая файл s1.bin с нашей "секцией кода". Перенаправление с двумя знаками >> означает, что отчет записывается не с начала указанного файла (затирая его содержимое), а добавляется в его конец. Третий вызов debug выполняет s2.txt, создавая пустую секцию в файле s2.bin. Наконец, мы объединяем эти секции в единый файл с расширением exe, причем заметьте - файл s2.bin использован дважды (2 пустые секции). Теперь полученный файл можно попытаться запустить. Но перед этим неплохо бы еще раз тщательно проверить все исходные файлы - вероятность допущенной ошибки довольно велика. Просмотрите файл report.lst - нет ли сообщений отладчика об ошибках. В частности, типичной ошибкой является случайное использование в командах вместо латинских букв кириллицы (особенно одинаковых - c и с, e и е и т.д.) Если файл создан правильно, ничего не произойдет - сообщения Windows будут лишь при наличии ошибки. Зато нажав Ctl-Alt-Del, вы увидите исполняющуюся задачу 'nil'. Выделите ее и нажмите кнопку "Завершить процесс" - пока мы можем закрыть эту программу только таким способом. Простейшее приложение В первой статье мы получили представление о строении машинных инструкций. Во второй статье научились составлять с использованием подручных средств файлы любого уровня сложности. Наконец, в прошлой статье начали создавать исполняемые файлы, которые система "признает" в качестве своих. Теперь мы вплотную стоим перед дверями, открывающими доступ к неисчислимым сокровищам мира Windows.Это API - Application Programming Interface - интерфейс прикладного программирования, огромная библиотека уже готовых наборов инструкций, входящая в состав самой системы и служащая для выполнения разнообразнейших задач почти на все случаи жизни - имеется в виду, жизни в мире Windows ![]() Сокровища эти упакованы в виде процедур и функций и размещены в системных модулях - dll. Чтобы получить к ним доступ, необходимо связаться с соответствующими модулями и импортировать из них нужные нам функции. Попробуем сегодня создать элементарное приложение, выводящее простое сообщение с набранным нами текстом и на этом завершающее свою работу. Эту работу осуществляет функция MessageBoxA, находящаяся в модуле User32.dll. Чтобы не пришлось "прибивать" наше приложение из менеджера задач, как в прошлый раз, оно должно также содержать для своего нормального завершения вызов функции ExitProcess из модуля Kernel32.dll. Обычно для своей работы эти системные функции используют какие-то наши данные, которые мы им должны передать в виде параметров. Например, функции MessageBoxA мы должны предоставить текст, который хотим отобразить. В первой статье мы рассматривали инструкции, позволяющие копировать данные из одного места в другое. Однако, в данном случае мы ничего не знаем о внутреннем "устройстве" вызываемых функций и о том, в каком месте они хранят данные, с которыми работают. Как раз для подобных случаев был изобретен в свое время механизм, получивший название стека. Стек - это некоторая область в виртуальном адресном пространстве процесса, специально предназначенная для временного хранения данных. Если помните, при создании PE-заголовка мы заполняли поля с размером выделяемого стека. Место, где разместить стек, выбирает система, а соответствующий адрес памяти сохраняет в регистре ESP. Этот регистр специально предназначен для работы со стеком и поэтому не должен использоваться ни для каких других данных. Доступ же к стеку осуществляется последовательным образом, причем операнд всегда должен иметь размер в 4 байта (для 32-разрядного режима). Для записи очередного числа значение ESP уменьшается на 4 и указывает на "чистую" область размером в 4 байта. В эту область и копируется единственный операнд соответствующей инструкции. При извлечении сохраненного числа из стека копируется 4-байтное значение, адрес которого находится в настоящий момент в ESP, а затем значение ESP увеличивается на 4 и указывает уже на предыдущее сохраненное число. Единственное, за чем необходимо следить - чтобы каждому случаю помещения данных в стек соответствовал ровно один случай извлечения этих данных из стека (это называется сбалансированностью стека). Рассмотрим инструкции помещения данных в стек (инструкции извлечения данных из стека нам пока не понадобятся, и мы займемся ими в другой раз). На ассемблере группа данных инструкций обозначается мнемоникой PUSH. Сначала инструкция помещения в стек непосредственного значения: Код
011010 s 0 <байты данных> Код
01101010 00000000 (6Ah 00h) Код
01010 reg Наконец, еще одна инструкция, использующая уже знакомый нам по первой статье байт ModR/M. Этот байт позволяет записывать в стек значения, хранящиеся в памяти. Но в данном случае есть одна особенность использования этого байта. Вспомните, что байт ModR/M предполагает наличие двух операндов (один из которых всегда находится в регистре). Здесь же необходимо указывать лишь один операнд - другой все время один и тот же и задается неявно (адрес в ESP). Поэтому поле REG байта ModR/M, служившее для обозначения регистра, теперь используется в качестве расширения опкода и для данной конкретной инструкции всегда одно и то же (постоянно). А сама инструкция вместе с байтом ModR/M выглядит так: Код
11111111 Mod 110 R/M Код
11111111 11110000 (FFh F0h) Флаги стиля MessageBoxA Поля структуры могут содержать следующие значения, определяющие внешний вид и поведение окна сообщения. Тип окна:
Таким образом, число 0 в качестве стиля означает простое окно сообщения с одной кнопкой 'OK' и без всяких значков. Инструкция для помещения 0 в стек нам уже знакома: 6Ah 00h. Вторым в стек должен быть помещен адрес начала строки, являющейся заголовком окна сообщения. Эту строку разместим в секции данных нашей программы; используя ту же схему, что и в прошлый раз, это будет третья секция, начинающаяся со смещения 3000h относительно базового адреса загрузки, который равен 400000h. В качестве заголовка можно выбрать любой текст; пусть это будет просто "Заголовок". В конце строки обязательно должен быть нулевой байт. В результате адрес нашей строки в памяти будет 403000h; поместим это непосредственное значение в стек (на этот раз мы указываем все 4 байта, поэтому бит s = 0): 68 00 30 40 00 (h). Третьим в стек помещается адрес начала другой строки, которая является собственно выводимым сообщением. Пусть будет "Текст сообщения для вывода"; расположим ее сразу после первой строки (после ее завершающего 0) - по адресу 4030A0h: 68 A0 30 40 00 (h). Последний параметр для функции MessageBoxA - описатель (handle) другого окна, являющегося владельцем нашего окна сообщения. Если такое окно имеется, оно (в зависимости от значения в поле "Режим") может быть "заморожено" на время отображения нашего окна сообщения. В данном случае других окон в приложении нет, поэтому оставим 0: 6A 00 (h). Функция ExitProcess принимает единственный аргумент - т.н. код завершения. Он обычно равен 0 при нормальном завершении приложения. Мы также оставим это значение: 6A 00 (h). Больше данных в нашем приложении не предвидится; поэтому мы можем сразу построить секцию данных. Создадим отдельную папку и разместим в ней файл "data.txt" со следующим содержимым: Код
n data.bin r cx 200 f 0 l 200 0 e 0 "Заголовок" 0 e a0 "Текст сообщения для вывода" 0 m 0 l 200 100 w q Но существуют отклонения от этого последовательного хода исполнения; одним из таких случаев является вызов функций. В этом случае содержимое регистра EIP автоматически сохраняется в стеке (это значение называется адресом возврата), а в регистр EIP заносится операнд инструкции вызова функции, который является адресом первой команды вызываемой функции. В свою очередь, последней командой функции должна быть инструкция возврата управления, которая восстанавливает сохраненный ранее в стеке адрес возврата в регистре EIP, и управление переходит на следующую после вызова функции инструкцию. В результате вызов функции выглядит так, будто это обычная одиночная инструкция и не было всего этого "путешествия" куда-то в другие области адресного пространства. Рассмотрим инструкции вызова функций (эта группа обозначается на ассемблере мнемоникой CALL). Инструкция с непосредственным смещением: Код
11101000 <4 байта смещения> Есть также инструкция с косвенной адресацией; она использует байт ModR/M: Код
11111111 Mod 010 R/M Хорошо; но как получить адрес нужной нам функции? Это делается посредством процесса, который называется импортом. Загрузчик Windows осуществляет его автоматически при запуске приложения, нужно только указать ему, какие функции и из каких модулей нам потребуются. Вот для этой цели и служат таблица импорта и сопутствующие ей данные, о которых упоминалось в прошлой статье. Теперь познакомимся с ними поближе. Число записей в таблице импорта равно числу импортируемых модулей. Последняя запись должна содержать нули для обозначения конца таблицы. Каждая запись имеет следующий формат:
Теперь мы можем составить нужные для нашего приложения данные. Разместим их в секции .rdata (со смещением 2000h относительно адреса загрузки). Создадим файл rdata.txt. Это как раз тот случай, когда могут оказаться полезными два прохода, чтобы узнать относительные взаимные смещения различных таблиц. Учтите, что все смещения должны указываться относительно базового адреса загрузки. Я приведу здесь уже готовый вариант: Код
n rdata.bin r cx 200 f 2000 l 200 0 a 2000 ; 1 IAT db 2A 20 0 0 0 0 0 0 ; 2 IAT db 38 20 0 0 0 0 0 0 ; имя 1 модуля db "User32.dll" 0 0 ; имя 2 модуля db "Kernel32.dll" 0 0 ; имя 1 функции db 0 0 "MessageBoxA" 0 ; имя 2 функции db 0 0 "ExitProcess" 0 ; таблица поиска 1 db 2A 20 0 0 0 0 0 0 ; таблица поиска 2 db 38 20 0 0 0 0 0 0 ; таблица импорта: ; 1 модуль ; указатель на 1 таблицу поиска db 46 20 0 0 ; 2 пустых поля db 0 0 0 0 0 0 0 0 ; указатель на имя 1 модуля db 10 20 0 0 ; указатель на 1 IAT db 0 20 0 0 ; 2 модуль ; указатель на 2 таблицу поиска db 4E 20 0 0 ; 2 пустых db 0 0 0 0 0 0 0 0 ; указатель на имя 2 модуля db 1C 20 0 0 ; указатель на 2 IAT db 08 20 0 0 ; последняя запись - все нули m 2000 l 200 100 w q Код
11111111 00 010 101 <4 байта адреса 402000h>, или FF 15 00 20 40 00. Составим файл code.txt: Код
n code.bin r cx 200 f 100 l 200 0 a 100 ; помещаем в стек параметры MessageBoxA db 6a 00 db 68 00 30 40 00 db 68 a0 30 40 00 db 6a 00 ; вызываем MessageBoxA db ff 15 00 20 40 00 ; помещаем в стек параметр (0) db 6a 00 ; вызываем ExitProcess db ff 15 08 20 40 00 w q Код
; смещение таблицы экспорта (4 байта) db 0 0 0 0 ; размер таблицы экспорта (4 байта) db 0 0 0 0 ; Второй элемент каталога: ; смещение таблицы импорта (4 байта) db 56 20 0 0 ; размер таблицы импорта (4 байта) db 3c 0 0 0 Код
@echo off debug < header.txt > report.lst debug < code.txt >> report.lst debug < rdata.txt >> report.lst debug < data.txt >> report.lst copy /b header.bin+code.bin+rdata.bin+data.bin msg.exe Если же все нормально - хлопайте в ладоши! Вот оно, наше окно, собственноручно созданное самым честным образом в самых что ни на есть настоящих машинных кодах. Фрагмент из книги Ивана Склярова "Головоломки для хакеров" Создать СОМ-файл (в том числе и вирус) в системе отключенной от сети можно с помощью простейшего консольного отладчика debug.exe, который появился уже в первых версиях MS-DOS и стандартно устанавливается во всей линейке Windows от 9x до 2003. Рассмотрим, как им можно воспользоваться на примере простой программы, которая выводит на экран фразу: "Hello, World!". Чтобы ввести эту программу с помощью debug.exe и создать исполняемый файл в системе, нужно выполнить следующие действия:Код
debug.exe -a 0B27:0100 mov ah,9 0B27:0102 mov dx,108 0B27:0105 int 21 0B27:0107 ret 0B27:0108 db "Hello, World!$" 0B27:0116 -r cx CX 0000 :16 -n world.com -w Запись 00016 байт -q
5
|
Ушел с форума
![]() 15840 / 7422 / 994
Регистрация: 11.11.2010
Сообщений: 13,385
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
30.05.2013, 11:51 [ТС] | 7 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Графика на ассемблере под DOS Представление данных на мониторе компьютера в графическом виде впервые было реализовано в середине 50-х годов для больших ЭВМ, применявшихся в научных и военных исследованиях. С тех пор графический способ изображения данных стал неотъемлемой принадлежностью подавляющего числа компьютерных систем, в особенности персональных.MDA Monochrome Display Adapter был создан для работы с одноцветным (зеленым) дисплеем. Адаптер дисплея преобразует сигналы, распространяющиеся по шине компьютера, к форме, воспринимаемой монитором. MDA является символьной системой, не обеспечивающей никакой другой графики, за исключением расширенного множества символов IBM (символы псевдографики). MDA работал только в одном режиме — вывод 25 строк символов по 80 символов в ряду. Вы помещали символы на экран, записывая коды ASCII в дисплейный буфер. Преобразование из кода ASCII в точки на экране выполнялось аппаратно. Для вывода символа размером 9х14 точек требовалось разрешение (80х9)х(14х25) = 720х350 = 252000 точек на экран. На плате MDA располагалось 4 Кб памяти для записи кодов символов и их атрибутов.CGA Color Display Adapter — первый растровый многорежимный дисплейный адаптер. Использовался и для символьных, и для графических режимов. Содержал 16 Кб памяти, соединяется с монитором 4 сигнальными проводами (синий, красный, зеленый, яркостный), и поэтому мог работать одновременно с 24=16 цветами. Позволяет работать в двух текстовых (монохромный — 25 строк по 80 символов в строке и 16-цветный — 25 строк по 40 символов в строке) и трех графических режимах.
VGA Video Graphics Array содержит 256 Кб до 1 Мб памяти. Позволяет выводить на экран 218=262144 цветовых оттенка, но одновременно на экране могут быть только 256 цветов. Имеет три встроенных ЦАПа. На монитор VGA адаптер отправляет три аналоговых сигнала, которые управляют работой электронных пушек монитора. Поддерживает 17 документированных режимов: 640х480 (монохром), 640х480х16 цветов, 320х200х256 цветов (смотри таблицу ниже) и кучу недокументированных, но также стандартных режимов: 320х400х256 цветов, 360х480х256 цветов и т.д.Некоторые стандартные видеорежимы Нетрудно подсчитать, что режим 640х400х256 цветов использует практически всю 256 Кбайтовую память VGA адаптера (640х400х8 = 2048000 бит = 256000 байт = 250 Кбайт). В то же время многие VGA адаптеры снабжены, как правило, не менее чем 1 Мбайт видеопамяти, а большинство находящихся в эксплуатации имеют не менее 512 Кбайт, что позволяет нам получить в свое распоряжение режимы 640х480х256 цветов (300 Кбайт) и 800х600х256 цветов (469 Кбайт). К большому сожалению, адаптер VGA не поддерживает глубину цвета более 8 разрядов (28=256 цветов).
Super VGA К моменту кончины DOS самый распространенный видеоадаптер. Содержит от 1 Мб и более памяти. Позволяет выводить на экран изображение с максимальным разрешением 1600х1200 и максимальным цветовым разрешением 16 777 216 оттенков. Адаптеры CGA, EGA и VGA программно совместимы всегда и совместимы снизу вверх: программа, написанная для CGA будет работать на EGA, VGA и SVGA, написанная для EGA будет работать на VGA и SVGAВидеоадаптеров SVGA достаточно много и не все они программно совместимы между собой. По-этому для использования в программе видеорежимов Super-VGA необходимо либо производить настройку на конкретный видеоадаптер, либо использовать видеоадаптер в соответствии со стандартом VESA. Функции VESA SVGA вызываются как подфункции 4Fh прерывания 10h. Номер функции 4Fh должен находится в регистре AH, номер подфункции (номер функции VESA) должен находится в регистре AL Видеорежимы SVGA по стандарту VESA Обобщаем. Видеорежимы бывают текстовые и графические, различаются разрешением экрана и количеством цветов, одновременно выводимых на экран. В текстовом режиме в видеопамяти находятся коды символов и их атрибуты, которые из таблицы символов выводятся на экран монитора. В графическом режиме в видеопамяти находится код цвета каждой точки, отображаемой на экране.
Видеорежимы меняются из программ с помощью вызова функции BIOS. Все функции BIOS вызываются с помощью прерывания 10h. Значения регистров при вызове функции смены видеорежима: AH=0 — номер функции BIOS; AL — номер видеорежима, который нужно включить. Фрагмент программы, в котором устанавливается видеорежим 13h.
Структура видеопамяти в 256-цветных видеорежимах Одни из самых простых в программировании графики режимов 256-цветные. Для VGA это единственный режим 13h, у SVGA несколько таких режимов. Программирование 256-цветных режимов SVGA незначительно отличается от режима 13h. Основное отличие связано с тем, что не вся видеопамять, отображаемая на экране, одновременно доступна, и приходится заполнять видеопамять частями.
Адрес точки для всех 256-цветных режимов вычисляется следующим образом:
Палитра Из 262144 (=218) цветовых оттенков, которые может создать стандартная VGA-карта, на экран выводятся одновременно всего лишь 256 цветов. Почему? VGA адаптер имеет встроенный Цифро-Аналоговый Преобразователь (ЦАП), который содержит 256 регистров цвета. Величина каждого регистра 18 бит. Из этих 18 бит на красный цвет отводится 6 бит, 6 бит — на зеленый цвет и 6 бит — на синий (218=262144). Номер цвета в видеопамяти — это номер регистра цвета, а цвет точки зависит от значения, хранящегося в этом регистре.Выбрать палитру — значит установить нужные значения в регистрах цвета. Для установки одного регистра цвета используют 10h подфункцию 10h функции BIOS. Значения регистров при вызове функции установки регистра цвета следующие:
Программирование графики В основе любой графической функции лежит несколько простых графических функций, называемых графическими примитивами. Такими примитивами являются прорисовка точек, линий, окружностей, а также заполнение областей и перемещение битовых образов.Точка Проще всего записать точку на экран в любом графическом режиме вызвав функцию 0Bh прерывания 10h. Содержание регистров при вызове функции: AH=0Bh, в AL цвет пикселя (если бит 7=1 выполняется операция логического исключающего ИЛИ с цветом экрана), в BH номер страницы, в CX — X координата пикселя, в DX — Y координата пикселя.Если Вы хотите писать напрямую в видеопамять, то например установка точки в режиме 13h сводится к записи кода цвета в видеопамять по адресу, соответствующему адресу точки A=Y*H+X. Ниже приводится программа, рисующая три точки разными цветами в разных местах экрана. Подпрограмма Draw_pixel выводит точку с заданными координатами и с заданным цветом. При вызове данной подпрограммы в регистре BX должна находиться X координата точки, в регистре CL — Y координата, в регистре DL — цвет точки.
Рисование линий на экране Проведение линий подразумевает установку на экране всех точек, принадлежащих отрезку. Сложность при рисовании линии в том, что точки из которых мы ее строим создавали иллюзию прямой. На экране абсолютно точно можно нарисовать только вертикальные, горизонтальные и 1:1 диагональные линии.Если у нас установлен 13h графический режим (320x200x256), то горизонтальную линию рисуют следующими командами
Давайте рассмотрим случай, когда горизонтальная проекция линии длиннее вертикальной и угол наклона линии отрицательный. Например, нарисуем линию направленную из точки (0, 0) в точку (55, 12). Программа должна провести линию в 55 пикселя по горизонтали и 12 пикселей по вертикали. Поскольку наклон линии находится в пределах 55/12=4,5833…, то можно точно сказать что линия будет состоять из чередующихся рядов точек (прогонов) из 4 (минимальный прогон) и 5 точек (максимальный прогон). Как разместить прогоны с минимальной и максимальной длиной? Остаток деления 55 на 12 равен 7, равномерно раскидаем эти дополнительные 7 точек. На каждый шаг по оси Y мы ставим, по меньшей мере, 4 пикселя вдоль оси X. После этого нам нужно решить, ставить ли пятый или переходить на следующую координату по оси Y. Если мы подсчитаем, какую ошибку отклонения мы накопили, и если ошибка накопления превышает 0,5 пикселя — тогда нам нужен в отрезке дополнительный пиксель. Длина минимального отрезка по оси X на один шаг по оси Y составляет XDelta/YDelta=4,5833… Обозначим XDelta%YDelta получение остатка от деления XDelta на YDelta, ошибка накопления в каждом прогоне составляет (XDelta%YDelta)/YDelta=7/12=0,5833… дополнительный пиксел потребуется если (XDelta%YDelta)/YDelta — ½ > 0 (XDelta%YDelta) — YDelta /2 > 0 (XDelta%YDelta)х2 — YDelta > 0 то есть, на каждом шаге по оси Y накапливается ошибка (XDelta %YDelta)x2. Если ошибка достигнет одного пикселя или больше, то мы добавим к прогону дополнительный пиксель и вычтем из значения ошибки YDelta*2 Теперь попробуем нарисовать линию — на каждый шаг по оси Y будем ставить по 4 или 5 точек по оси X. Если соединить центры наших прогонов, то окажется, что наша линия смещена на 2 или 3 точки от идеальной линии. Чтобы точки максимально близко ложились к идеальной линии применяется балансировка прогонов. Для этого берут один максимальный прогон и распределяют его равномерно между первым и последним отрезком, чтобы концы линии стали симметричными. Ниже приводится листинг программы реализующее построение линии по алгоритму Брезенхейма с переменной длиной отрезков.
Рисование окружности Построить окружность несложно. У окружности координаты любой точки относительно ее центра вычисляются из соотношения R2=X2+Y2, где R радиус окружности. С точки зрения программирования достаточно нарисовать 1/8 часть окружности, а симметрия закончит дело. В языках программирования высокого уровня существует специальная функция CIRCLE, которая строит окружность либо, вычисляя синус, либо, двигаясь например по оси X вычисляет на каждом шаге координату Y по формуле и так в цикле. Вы выводите N точек, где N вычисляется из значения
12
|
Ушел с форума
![]() 15840 / 7422 / 994
Регистрация: 11.11.2010
Сообщений: 13,385
|
|||||||||||||||||||||||||||||||||||||
30.05.2013, 12:08 [ТС] | 8 | ||||||||||||||||||||||||||||||||||||
Вывод монохромного рисунка на экран в режиме от 0Dh до 12h Программа приведенная ниже будет работать без изменений в следующих графических режимах приведенных в таблице
Вывод монохромного рисунка на экран в режиме 13h (320х200х256 цветов) Исходный текст, СОМ-файл и картинка здесь
Вывод монохромного рисунка на экран в VESA-режиме 640x480x256 Исходный текст, СОМ-файл и картинка здесь
3
|
Ушел с форума
![]() 15840 / 7422 / 994
Регистрация: 11.11.2010
Сообщений: 13,385
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
30.05.2013, 12:15 [ТС] | 9 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
описание ключей ml.exe ml.exe - это транслятор языка Macro Assembler фирмы MicroSoft. Главная задача этой программы: из исходника перевести все команды Ассемблера, набранные текстом в коды машинных команд. Сам ml.exe не создает готовую программу под конкретную операционную систему и её формат. Он делает промежуточный, так называемый объектный файл (с расширением obj). Но после ml.exe вызваем линковщик. Так мы получим готовую программу. Как и большинство трансляторов разных языков программирования, ml.exe - это программа с интерфейсом командной строки. Здесь мышка не поможет, нет смысла пытаться "открывать" компилятор из проводника без указания в командной строке хотя бы файла исходника. Вид строки: Код
ml [ключи] список_файлов [/link <ключи_линковщика>] /link - параметр, с которым указываются ключи_линковщика (см. таблицы ключей). список_файлов - имена исходных файлов, которые будут транслироваться. ключи - параметры компиляции, перечисленные ниже (ключи чувствительны к регистру). Параметры, которые вы используете постоянно, можно добавить в переменную окружения ML. Транслятор будет учитывать эти опции всегда. Форматы трансляции Главная характеристика трансляции - это тип выходного объектного файла.ML.EXE умеет создавать только два вида obj-файлов.
4
|
1127 / 261 / 9
Регистрация: 11.06.2010
Сообщений: 1,049
|
|||||||||||
30.05.2013, 15:57 | 10 | ||||||||||
FPU. Округление. Порой бывают такие случаи, когда надо вытащить целую часть дроби. В этом случаи все прибегают к помощи такой связки, как
Например, у меня был случай, когда при делении надо было от частного оставлять только целую часть, но связка, упомянутая выше, в случае с частным 0.501 выдавала результатом 1, а не 0. Когда такое происходит, помогает вот такая связка:
После применения данной инструкции всё заработало так, как надо. Вот так.
4
|
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
|
||||||
31.05.2013, 07:34 | 11 | |||||
процедура пищания динамиком под досом.
2
|
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
03.06.2013, 08:35 | 12 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Длинные числа Стандартные типы данных позволяют хранить не очень длинные числа. в регистре еах максимум может поместиться число 4294967295. Для некоторых целей оно очень мало. Чтобы оперировать числами вида 10^Nпри N>40 нужно изобретать свой тип данных. Один из вариантов – массив.Предположим, необходимо вычислить 30!: 30!=2*(104)8+6525*(104)7+2748*(104)6+8121*(104)5+9105*(104)4+8636*(104)3+3084*(104)2+8000*(104)1+0*(104)0
ВВОД ЧИСЛА Опишем данные:
Алгоритм протаскивания старшей цифры из A[i] в младшую цифру A[i+1]:
Готовая процедура:
Казалось бы, нет проблем — выводи число за числом. Однако в силу выбранного нами представления числа необходимо всегда помнить, что в каждом элементе массива хранится не последовательность цифр числа, а значение числа, записанного этими цифрами. Пусть в элементах массива хранятся четырехзначные числа. И есть число, например, 128400583274. При выводе нам необходимо вывести не 58, а 0058, иначе будет потеря цифр. Итак, нули также необходимо выводить. Процедура вывода имеет вид:
содрано и переведено на асм (Окулов С.М. "Программирование в алгоритмах" )
4
|
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
|
||||||||||||||||||||||||||||||||||||
13.06.2013, 09:58 | 13 | |||||||||||||||||||||||||||||||||||
Процедура сложения длинных чисел:
программа вводит два числа, складывает их и выводит результат на экран.
умножение длинного числа на короткое Под коротким числом понимается число меньшее основания системы счисления.
для особо скептичных: факториал 9999: Кликните здесь для просмотра всего текста
Код
2846259680917054518906413212119868890148051401702799230794179994274411340003764443772990786757784775815884062142317528830042339940153518739052421161382716174819824199827592418289259787898124253120594659962598670656016157203603239792632873671705574197596209947972034615369811989709261127750048419884541047554464244213657330307670362882580354896746111709736957860367019107151273058728104115864056128116538532596842582599558468814643042558983664931705925171720427659740744613340005419405246230343686915405940406622782824837151203832217864462718382292389963899282722187970245938769380309462733229257055545969002787528224254434802112755901916942542902891690721909708369053987374745248337289952180236328274121704026808676921045155584056717255537201585213282903427998981844931361064038148930449962159999935967089298019033699848440466541923625842494716317896119204123310826865107135451684554093603300960721034694437798234943078062606942230268188522759205702923084312618849760656074258627944882715595683153344053442544664841689458042570946167361318760523498228632645292152942347987060334429073715868849917893258069148316885425195600617237263632397442078692464295601230628872012265295296409150830133663098273380635397290150658182257429547589439976511386554120812578868370423920876448476156900126488927159070630640966162803878404448519164379080718611237062213341541506599184387596102392671327654698616365770662643863802984805195276953619525924093090861447190739076858575593478698172073437209310482547562856777769408156407496227525499338411280928963751699021987049240561753178634693979802461973707904186832993101655415074230839317687836692369484902599960772968429397742753626311982541668153189176323483919082100014717893218422780513518173492190114624687576983537344145601312261522139117875968836736408720793700299203827919803870237207803914031236899760815284030605111670948472222487038919999344207139583698306396223207911562404425080891991431983712044559834404755675948921210149815245454359428541439084356441998422485547853216362403009844285533182925315420655123707970581639346029624769701038874220644153662673371542870078912274934068433644288984710084064160009362393526124803797529334392876439831639031277645072247926785170082666959838952615075900734921519759265919270887320259406638211880198885474826604834225645770574397312225970067193606176351357952982179429079770532728326750148802444352868164502616566283754651900617187344226043891929850607151539003110668472736013581670643786175675743918437647965813610059963868955233464878174614324357322486432679848198145843270303589550842053478849336458248259203328808902578238823326577020524897093704721021424841334246526820680673231421448385407418213962184687010835958294696523563276487047571835161687923506836627174371191572336114307012112076760869785155972184648598591864364171685089962551682091079357023111851817477501080462258552131476489749066075287708289766751495100968232968973200062239288805665803614031128546592908407803397490066495320587316494809388381619865885082738246803489786475711667989042356801830350413387573197263089790943571068779730163391808786847494363353389337358690640584841782806519627582643442925805842221294764940294862267076183298822900407239040373316820741741325165668844307933944701920890562078838758534251282095735930701819770834016381763827856253951682542664461494104471157953326237281546879408042371858742302620026422182269418862621210729777665740101837618228013685758644218586301153984371229910701009406192941322320277319395946700671369537709789777811828824244292086481613417956201747183160968766104314049795819823644580736820940402221118153005143338707660706314961610777111744805955276434833338574404021275703185152729837743592187855855279559102866445791736200722185814330997729477892372071794285775627130092398239792195758119726474264287826668235391568785727162014619224426626670840076566562580710947439874011077281166991880626872662656558334566500789030905065607463307802715853081769122377281351058452732659162621964762057143488021563081525900534372114100030303924286645720732847348171203416818632896886504828736793339844397123673508452734019630942769765268417017499075694798275782583522999431563332210743913155012445900532470268031291239229797903041758782339862237353505464264691350250395100923928658510868208807066273473320035499572039708648806604092985460700633940988583634986546613672788074876470070245879011804651829611127709060901615202211146154315831766995706097461808535939040006789287854882785093863735370390404941268461899127287156265500127083303995025787993170543188275265922581494895074663997600731692731083173588305661261478299766318807006304463242911226069193127888156622159152327045769586751282199093894268660196390448971891859747292531032248021054384104432582847283058429780416240510811032691400190056878439634150269652104892027214023216023489858882737142869533968175510628747090747371818801422348724849855819843909465170836436899430618965024328835327966719018452762055108570762620424450962332320474470783119043449935144262550170177101737955112474615947173186270156557126629585512507771173833820841970589336732372445328045653717851496030880258028406784780941464183865922665280686797884325066053794304625028710510492934726747126749989263462735816714693506049511034075540465817039348104675848562596776795976829940933402638726937836532091228771807745115262264254877183546110888636084327280622777664309728387905672861803604863346489337143941525025945965250152095953615797713559579496572977565090269442808847976127666484700361964890604376193469427044407021531794358383105140491546260872848667875054167414673164899935638131286693142761686353730563458662695789456827506581023595081488877895507393936534193736570084831850447568221544406759920313807707353997803633926733454954929666875992253089389808643060653296179316402961249267308063803187391259615113189035935126648081856836677028653774239074658239091095551717977058079778928975249023073780175314268036391424472025772889178495007811788933662975043680421466819782427298069757939174222945668318581567681628879787062453124665172762275829549342148365886891929958740209569600024356030528982986638689207699283403054971026651432230612523191513184387690382370620539920693394371688046642971147674356448637502684769814885310535406332884506201217330263067648132293156104355194176105071244902487327727311209194586513749319096516249769165755381219856643220797866630039893866023860735785811439471587280089337416503379296583261843607313332752602360511552422722844725146386326936976376251019671438012569122778442842699944082915221590469443728249865808520518657629299277550883312867263841871327778087444664387535264473356244113944762878097465068395298210817496795883645227334469487379347179071006497823646601668057203429792920744682232284866583952221144685957285840386337727803022759153049786587391951365024627419589908837438733159428737202977062020712021303857217593321116241333042277374241635355358797706530964768588607730143277829032889479581840437885856777293209447677866935753746004814237674119418267163687048105691115621561435751629052735122435008060465366891745819654948260861226075029306276147881326895528073614902252581968281505103331813212965966495815903042123877564599097329672806668384916625794974792290536184556374103479143077156116865048429249028110299252967873529876782926904078877848026247922275073594840581743908625187794689004594206016860514277224448627246991114620014988066272353883780938062854438476305323507013202802948839200813213544645005613498701783427110615817728981929065649868808104556223370306725425127727733028349843359577257595622470370779338714659303308862969944031833266579751467650271734629888377739784821870071802674126599715872803544047843247867490712792167289852358848694354669225510133760637791516459725425711696847733995115899834908188828126398440050554621006698879261455821456531969690982725393451576040861347625877816586729441077535882416231577908253805474693354058246971767432452345149848302717039654388773763735819173658245427334749042426294601129988191656371384711184915691505476814041174980145426571239420442544102807580600138819865061375928853903892264432294799028648284009959867596358099911269536760152717308685275657214758350712229829652956491783507175083574136228254505562027096941747679925922977488862741131458767614753145689532809311705269648641018740767329698664923643738256547502281647192681555988319662984830777666684062231431588438491051905828181674076446303330011971029303645586659465186907447525083784198762299041591179368279976065418608872162665488649234439103092325691063377596973905178112276466848679173604940439370333935190060938726839729924647848372727477097746669359978485712015678900024194726922097498412732314740154998092038145982141648117635714780155423159966783853485448640693641055691353133523118405358134894093819182189869482538396098994282202759933963520621770534357207339625057421676946510160849560143930324430427157609952730868460920442222610315422998444480211009816133382482737521899873820531516492713449810595015997480057159191220215448774875010347324619063394130303089239941198500622590218416440998817321432442210855424862089625026060439818018902631778114661745499977144066523286384636384700165561815386109818811118173419130550502486034585675558563751172977429932907494423657966833270091836733897734790175924888566037995277154056908301731172389414032615961229291222519109594874380567338127853861649184278693841755689804710085986837203361517515809702256627520016095619222992540175987852203854591377178397638981119848580329104875166692119510451489667776159824946872742066343759320785261892268728552767132488326779415291283916540796834419023909480367668870783801136704275397139620142478493519673530144440403782352667443755674088302522574527380620998045123318810272901204299798900542312621796813523775804116251145917599327913417650729282676223689729196052828967522352142523421724784186931739746041187763460462563713530980159061773675871533680395855905482736187611215138467343288432509004564535818668190510873179134621573033954058098717201384437709927953279767553109938136584040355679573189414197651143632552627063974314652634812003272009675566770192624258505777061789379823109698678844854665952732706167030891827720643255191939367359134603775708319318084592956515887524459760172945572050559508592917550651011566507552163514231815354817688419603208505087149627049401768418398058259403818259398646126027595424743337622625628715391606902509898507079866062173220016359393861147539456140663567571852661703147145351675300749921386520776852382488460062373589660805495165240648054729586991869435881119783368014148807832121345715236012406592220850891295690783537057673467166786378090881128345039578481221210111725071838335908388618757466120131729821713107294473765626517231069488442549836951414738389247774232094020783120080723532628805390626601818605042493878867787249550325542428422659627105069264607176746750233780567189345011073737703411934611337403386536467513673366139473155021145710467116144525332485019790108343164198999841404504490113016375952067571556750948524358026910407763721099867162425479538531285288993095657072921867352321666609787498963536261052982147256948279999622082577584098845848425039118944760872968518498397636791824226657116716658015791450081165719220023375976531749592239788498281470550619068927562521046218566130580025560797460972671503332703231002527464042875555654688376583880254322740350743168427862063769705479172648437817444636152057093322858728431569075625556930555881882260359000673933995250437988747093507927618111627630977125798397599652661212031749588205943575488386228250840140888572058399240097121921254807409775297427877591256602644348271364723184912518086627870862611669998963481240580368479458736482012465366322888901163657227088775773615200345010226889018910167357205866141001172366476265783539636429781901164705617027963192233229422873930923333074825893762619899759653008413538324112589963962944512908280202322549893662750649953083892563224679469596066904690668629264500621974012178289987297970485902177506009289332895727239201958999447194514736085077040072571743931814846190940626954528503052634100056502222615230936488288712204645426770057714899433514716250425236517371026606864725345812018668327395368254745653655359754668578870005698836028668645074025699308748344109408608630370790829524057673168494185581048247530475892339280157130282410623499994593239052140985655956566134600339615051516475885274221473251799954897799284952274602985566670081187120085615501645740048417021030303899633925333746655681782441073740933691929410463230773199475982630738349960077037241044628541464870411627389564983455516216568511455138382204700548399667170624646756610129138204890912111722938624425315891306698746204558724480605282937814830262216454228042175776076236545982822307081550346940493831775505330509469899947611941923128072180721696437843331360676067696518713839433877248549368906184570057204369666646508073449581449596630624669867983287258630006421522021017181391732527517367226262145494546850600633469271383831171584975309264325248696022005909980266376538622546326516841496330636954808655110125675771789061669475834404348621848536959160217203045618349752416203992644133165188476860683064200485855792447334029014258887640371251864222901633369158506327372719959636291278334478621888787100953375355105468898023637826371492691328956433944089947012145213457211771565759145173489519501680062135392717541984387616354347980692088666622709951237170624192491428257645312576993973534167304686458518197966823201569379268492699998399241357194149688227370402282080517180800340048061526179201397894518629529055844070373830053355242115390338518582936677919061011630623367314441920289385720185556959633083361545029042482230929708712478800201738307206048268015667539759378993179351579995892956215630733841629459990027673083282771659506421796652319043925054322675373181175531547678073947033893118510729772431837897267495745577818334549594231735355829104696731539127597568728186169116108315633723263996888149054394326119718227499679117662855340186019831580962998179110720880499229201606205906727127359946187163494577499580533794718710545645257939602421025913641552839839520177301271251489205106170822800833998566578664692073711426968230177041632482947940955869469908937916519100630518535210234518979812761914306186436270308197712499275105673290948120205774710068770337970893422920718390374416750349381883634222928494679066028567429325164256904436347308765679705659567728529108124273315440658019980271157912625417279745286257486592193329380591523952473551888711986039131965428757629019050396408356024627753431440915564218172945994159606197962263324271586342597794734868207480202153873472970799975333298778553105382016216979188038075300633435076614773713593936265190522224252814108474704529568864775791350216092204034844914995077874310718965572549265128269348951579507548617234139461036517661675032994864224403965951188226498131592508018512638663530862222349109462905931782940819564048470245653830543205650692442267186325530764076187208678039171135636350126952509129102049604282323262899650275895105284436817741573094187489442806542756143097582812769812493699331302894667056041408430894223114091272223814847036434101963041363073677106003815959082974641011442135832104257435835022073717321974508903557318735044582723877072827140616299791962935722410447715505165253586754410939507921836901526113844038268005415092434651171143647789944455399365366772758956571398750554299082458560951003693466310067371470802992765693343550092718985405010991747497999155439203190896196761544468604817540069568947146392824538380701044418104550617130516058435581752103233846582920107103006112428340745860700606019483055136486702102036470847080742270437189370696568879561792871304522451684202740202196641560528033506129355873907939352440409258424838060717744460996403522189102296190903256904238137449249490689231433088422439963139639154585406528632646880758114874837140828417645522638631352026489401626249480238856823159910295262033712644927990193821113451844638754451639123937797419057664991176423763772228280231846573805012127780968031569147726491025750350875879224811022354452441087244856570075518713214659209354850455282917074959677540445077949483637175606232692575741281311024191037333808043432531088469483155572940226539497291381758133861945705779956180875595141364490761310961715592837658584003648937407682225752393598873108168966768828740383719282769043151410699767830381908569071309193134084601951114748276635072467653492204005862667763293551663193962249897991270800446598226489912522681312430052810499505859567652712359149444261255443761864502920288135858287178957722411638081516183160312972879698748013982862164562919615309635833731361972477333235302546657119690261123738062903024290427579454903002266084744651316174169191685174646494545969600533088525279208347249523547311067410909922354105550629968764215395124935598631134666172511689078563332893556915044948518911348830187636510063850256591643302192856559626391438289506832483872716561656011153151705522295576594497245478881553231641745326716797886114116535559758833197963807096299888076730361694031773644814042786778425123244997469342134821717959519069820460299717200117485730388971920559741474245301113586976625660777097022563326170110846378479555525850457805887944075606497412797453091841840520755852646220882148364675465223760921078753919045468485234975998604494332282807312067992240247750751410589077462733431909125545135222532927591384204738460305616315423655293531227838975944651578733734346317228000103138042548140402209058040505600386093740343506886308143468384890070893856505002756905967806940469843518453513414103161513368304371478664292538971716597862901072840075893970038831774264816372511327736992682770946534258359611188195509246206215397812119724476262377153445204806981908252494396396225111383117742897853582559083249048049751604710425756975344255151577981560037084723060348475397751368839040431601748624887133931181852302942542567620248568839397083674878845378917257414515591791903539853507720090059497935293945963121344550336826069005982871772353337522194191554730374206234326289296839701505889219111204924986479205341087234911543098718216005576220907573230462610659774494765834631302559863631502995967235247694397546253020678819330437228480020930535415564066483856937814460313869756345920023346260699595551348475414789118083032981642158745292295267893792564775202905267534935667374429318267337457164246540774826790104677875908540813053144717645586989416966894043648995246524744398834958387120629648541335755381341950049874381336906270397387458660429687159582071576659982660731700562446554176302450134915956728894261974614449690867165585978272922870272377483509736290101913041781273577303778180408158913600520731580694103430500318434934236026924473306001386111978177447266960892832105254311649603342010203260386367253288964833340586220484361657536200146840547664966647356697957295339480913826370332422093083936695498068824049162206314791149464204250002245041342555856193744290525725243632005448744152430730521507049102043407657247686509575117412541372953164452176557723534860182156683335252053283000010834400876226684381702323560564515825695417735919781364997555960191256774494271798636004584740520929008939731527602430495165386443138814787697754147875743261015987970975885562580676619797309847246076948482112794842797653660705505163910441502255442032972129203300935335668729459591232796588637648689418843364054849400957496579165768721392733015355509786511476794739969062318487837751546261382365166595633720934570820830184048279700572807143292572757743622958704736164160973181724159420427036606640408974024552153072522738863724185964645522367326041116459846402001021692082331515538882107152719126787653179507190820452510044782129131854405481449415186711420710369389112912501275085346633771774937601654345469639004271112982925509683042066572536427947220002083531388370878164995718971762933879485427127688265200376632592456161486874489747151936621927566585246211445740701067538042756418444083480520383826505260169858406008478842242188785692789775181044280547442722945516742033568646060997797312495043332142520505367579049952078359765041537900113257953604065517265487902217359544415113942923164895066317781303905746208244917192131186412963370466140645690017894235673877552313095278591277453324185544248448449366421073134881918064018922231730215664581347318644999790578166209146987071803938888578128074022636360229411435486987140214357205594773089280865367892020193510260536156792448327674947611785831607186571031084220056025954511519139130911954444784436103274187610233884339168758923342379085984196826652561062875123757231849147495194598572889793498179176182265248040823712810979077263886428606791708228857585270347083971456161992624784479469279499684594563238270229736417350343078319411569824782001329085120287847480586018896004590174597405563073271448767908528886797880997069524068100662561144001498341358088973724684406494885707416768791641322420537365406733018639249791091547478595916386559750709058117592489950221479925094563558251431581446406013428349042279835793965925898520076384564668164073268192834600776728587628490006887456463927496441590403403367233781449159703294178729415506105412951540015939385166392932567742955754948004665827357965399094023354364464937682727254187362754753297680819032533614108643308423777173899522153676309530204590243869463270289529399448301357758908121488455849381987450592091406720952246909626307694175334098369885936370031497372897799636001862650017492929008793118999782296371230664229799616358257260011228898364765141804597577004212083394936465964733646428904449932539622709190737370577205132281595786322759191278605429786295318861555980472816071086413280358540016005557568685579178597789919790265659262128300722535140152597356930072901539221111686850474040217217444205173800025136100049453411932433166834424312596309881239696220235885839558783168519483312665357735324437993568321526917704224903457453485891381258268136690892947680905263556063811966130606393693841181771354592988431723291223626245886839420288998169356116986542988477651311822766252673997880881601047065154233501567135374481708623431466253119029104015226292710409928507241884332900727779475411163755217656358931632663604938121840183751281888477116897547948376766408484275362307401954218321798549626066659034792581634239267094783990706292316653503728501975132481380383707089463892547088703908572358100613062864666471000610435211577892661343221465531141188259694292628452210902668841497576334155492113558125461655807827347011581400600834576213313038998784327065371995670957084738578609264918885837873923916555426357730129224364160406255173689233563656885436585164620782187574172436452581414348763276134175270737675492227628778226476515431534158571377352273033540337636420425803425726474968621782366695135341067737842113137113198737322289180527506281227771641249441240120712595431999174657474589258261371282555553508040414394455729599455463560848725133946293635894083209896480161958313042972096479412853938899626536892826380767716875958850221646458243094016500968879736615773356031683671038689522827094150954522274400273549925367021471599405654481384218638012879990082093357632073636940599142426371829400061374190057951309629854533074819780256830108967287380223482048886297313036968988264065790478156238977848536502569106423179573602533090876327178491118974843224686808634038396417612760578864657447228482493268744306255122050695516846466947718368191143287354481583635054814641109996014339059579976629064688129502503915092363301107607063286331739337814969338024758003505278978275575092860403942050634293932706463616103182287924815267930686274923727563185222565426600855684949772028590915093049542596747364833143723634955544890159866840836217691355965603951967042536886348236958712946252475903177681318497758827657674048255813650210364958550570325921995767533426422378372358605850940358397710347667064478864083110965030256521560746401965271699973237346523717345659551455949309816664400621159934913318013515052865184217882802634332593475585076116869770912558005618568371054085608124951940314806461871940257766328526701969838756756152469675902810686489686929331595435209768752713720161616093117425019970928968494003469624232568841066511330437741225617625865894123672817114552642389451263171783479027692117145288735295501933675921890800604863373778672818061025478257043678844950351892578749983669478590861297554308412267706095434761213371743315678379016201233723702333831641470642859218597761015823272199791506287186818675098166553774501302088033390435363977026336380909852649453262814655806554650482348642949539061325740049691288834051822293364447668385503796797580961998357580702775953596878822619465961222304454927560027495516858354258229533604283442631847806882539545074669187789776540603843251284381281131685620460861728940822965862617442076692029742793008812951985467871354862323661041321658127926715154596159435259345675744599230788920551954008231640971959125002545523750310673563974883554248044968138303067185193149133578920212360530819995202058450342349993215096263497781245665830468058182456352481462584933192619540688481844644524842948606301616947666324262523147632237110969536948382448231641039622450767540561428746826783572370489560699065279268845584451204665485337853402664664504233963848825771987495361130049421559373554521192618672147826541688560409492829005661688380763765669051074089251054916522296887867696863165251491770149990006663734454612026278070192569870622554092894519471877800430613002182828742586704874848082694857344477824407873410271082487026952383080491096048201390129402463124480015933667021265831767787975296596347257689432654043588926729395068786083062626626328739208732730254791009993211338897780781433672879144876837368646774852877773740354747287164421776782071296450627088097863792814407119250514114800490705560809722929979244147106285224702987069986922767634177351325860290890387570745436807787642238533370069208961635100923358730398654390607188095255755338036472589500730677212252807817947105648117137855745105769104432292542902414943358839609367932136169695425129973103103280443695450192984382084238312126582574059450942694277730712480217691578183572008717053877325601798713300550591137782384179164028084140962382084763739301393077842855454522236755982466625060875428487610414566136222764240591430445558085631818093523040779389161490211629240051507491406844320323036560995487862099919430656445533254713555736531851601170032155069078771675206288152788589714941032098698408304896652435103050244467993177914765910342894912905412036160169567122214080636940594030455218621287993309285623102241844636528909744464015198662318388196244482259078358591404368619301904145896269387890703498216986869693444808621399053459179282665430479820721963413475564652548314377115667845907779719651077246800029358154626764631022427900731363135252206706295112593587447313418649249728278479664458544896293290526205806524858870702087938913447608334465317093924240824932800891573131954134831182092775248688054873394331586756266612217935505119060999291137944563499562739189845902902171315570609626788167330294019846423739044509802803094897598125925205585097353743655682578031368190200715167569382728181882458754171072118080655644803912250453708942269535838219253507569283409563985926559974039131670929004399627597683037521750336087902829567306886226307772973353385368266873451903570970968732232373830049409012323927431875904652632709517840626726482889364689659321916952110636172975707437614806160133110491169227131860940414501484286642363471698289241818048436523053886455980983927383649068548082301426780314393744043180782267877949400620648915124895251654300563444837504675175420704331337248687063323756164523236048193202437759689091478337217955367699260323571518551339109840273906375328070231330175575426939620262942391094532353791012594896494181256367299296708425066759980345627345559855962851228141458255602484178330564524050845006598875598751860133586062493278448777200684229659194551653956298296059161004657890721484205486183041817560455981516808803178308026144599444467791801243214640098361067868341297487259672925878680622308011582202628901436445900230164582366670926557126455992579062230474523562557511177079151200278938097577546854612101730752279924140702630813779297190946141314580208108773812162453985876969737142588183615260506938092691771208732191500583197711332279357238507194061276129187257209940493025027774815661402132743474388196641333005263422908290640092794492480855613118344016180480135703250783632393892156764315962044261280970094410777613063890907129445639405660155924602545420477118614042015523337127050137712103457000957800938926532938572047857650877714966340300356238059575719160938217131222281046585838894350717643193997301266159142383717028440012039948588099623185947247485877658435507700693409922034037877219272837030138083814439411498497173076616296134205910501481428394970069595167693904155790285635691105554731268457149744963532055467794077518405666763722296909034612870682988710427876109009099916044382179451176362083537971616183312436443126785543555080050798612466439772413550212823802672671991498972724851298128728369748927642079286866697017725979440785815590933250855413129994658111852769165246479081911938423327589769957301209810300917100169571879161694227007952891519191252105389183853895931516740050572381740103062100438024301118797770425232807323657512960937245605368003751659616423614770933039122440975287173206797612812042802673925655730567593151264575004787575653185482582141157403047314749251191083561576573200254610968670189030764853137383291268248174118135903282662508254931321143147895335231704398905392853494664288607426837182490249809247948722663368682379958087563704080865564932190548963778554953116739793527079947045239915329753435869051410586409653451418289647443936718285271184356079928589597817654395011308884841916351667321369286083095674450280180037371645800916808297270871560918503865405343666004550498562468737602255704159580025017409536183928764345800367086495405794172008513635712716376832349313423070382127448450144052954169537438194545945653316514099099372272280101965465272622783151210346768616682613147184361002551786324795015002295369546631773958934413148148583469437452398115995466607120599779436344018507836089910894807341963393925931897394094311004211672912019972262660987192701402410580551531510010980499604414729103945103031266411472673683997331503503674274154699263316527043294067523744907505673950892967477911580086439999256481720884742925082154627985607912776861194608621034940553585013447219024454382452108928440949813271701067396647111493189678997766159548818619317690017502790178382462438787383148327950087902643399257702658800584977898462429566032127694581082434812969084097255067105473247131725499719190103955330584704072808169315862609388601914768994413767362143208360737513157437631675466647918675389657155510085062681000511982748680778059266776565410083477857102425013325339158738476102412979473675100116349897780374593002545760987067109215359711517825201428121664754303407512860024029703842861598428981660214342984908891735968219228446912303590432987723184330991418726467460755831872571313883235601580900959418253020779939764846259790188334179383092096584146357441198587829647585094305300814834182174782660377376225299770346875290351731079208322003808080921216434658681798981050427437538578678918635051771750160653182640692888325013591951717853768786588175236642153401096129576307476264807031275736578776235285905715393248457650394439049666808771189919249893389652485239553679582753061416713175791575638660600483999417954870586820920119515495203129456245131542250657485862916160652379664301017269395028229466748968174682116399679495029428401309923590127825043742819255763453321757616229275111059836827156722977862005372293231408288705874944406011623652162771755850301345147145276584186427707176996843549962025754743181199488338580675969235958062216583246409209535064835793581774290301831535129001432149551817745690838871932069776969565777175449914991143136895083616069253960646989337487094293321918560129910856447025625716350550862068924029758968471428367868473545553358347765253615657818999698306865467173644599634313646819542742049047243306467500144269750832236901308389549263706677840653132866488608012951377172084758115771949101234514177494148277358004143266733237961771696569858278583230050526588350224786805064820144457059319734338292386007260169651090325898090991283765227538149352984509941496693386281556803130698106452519270381851587264869176256323944142521611842776914506771841173571439668100561548395244315494486423838429890039982611332246896334652210469254513796927600971964533895533210558424564018744861105095911176682894271164005401050377042034605252131822804589299863790357235066510878235004334994239128523630889651098924664105633158417114288530414377228662983231897086903040030132595147677423751615884091583805915167350451913117819394342848292227230406142258207802782914807042676162930253922832108491775998420059510531216473181840949313980044407284732590260916973099815385393903128087882390294800157900800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 подсчет факториала любого числа меньшего 1000000000 (проверял только на 50000)
5
|
Ушел с форума
![]() 15840 / 7422 / 994
Регистрация: 11.11.2010
Сообщений: 13,385
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
25.06.2013, 05:06 [ТС] | 14 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
несколько способов создания файла в DOS
3
|
Ушел с форума
![]() 15840 / 7422 / 994
Регистрация: 11.11.2010
Сообщений: 13,385
|
||||||
25.06.2013, 13:16 [ТС] | 15 | |||||
Выдираю из io.sys (можно из ntvdm) кусок 21h прерывания, отвечающего за создание файла. Упрощаю и выкидываю "всё лишнее", в результате получаю СОМ-файл, создающий файл на диске и не использующий прерывания.
Кликните здесь для просмотра всего текста
2
|
Ушел с форума
![]() 15840 / 7422 / 994
Регистрация: 11.11.2010
Сообщений: 13,385
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
25.06.2013, 13:20 [ТС] | 16 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Поиск файлов и вывод содержимого каталога на экран. DOS Поиск файлов в DOS реализуется, как правило, через функции 4Eh и 4Fh прерывания 21h. Эти функции позволяют обнаруживать в заданном каталоге или на заданном устройстве файлы с именами, соответствующими заданному образцу.В DOS существует возможность обращаться к группе файлов, задав так называемую маску имени. При задании маски используются обозначения: ? - любой символ, * - любая группа символов. Например:
Приведем формат вызова функций поиска: Код
AH:=4Eh или 4Fh CX:=Атрибут файла DS:DX:= Адрес строки маски имени
Приведем пример программы, ищущей и отображающей на экране имена всех файлов с расширением .СОМ в текущем каталоге:
Поиск файлов и вывод содержимого каталога на экран. Вывод списка файлов и подкаталогов из указанного каталога.Используем системную команду DIR Код
DIR [диск:][путь][имя_файла] [/A[[:]атрибуты]] [/B] [/C] [/D] [/L] [/N] [/O[[:]порядок]] [/P] [/Q] [/S] [/T[[:]время]] [/W] [/X] [/4]
их действия введите в команде те же ключи с префиксом "-", например: /-W.
Поиск файлов и вывод содержимого каталога на экран. Windows Пример из книги Пирогова "Ассемблер для Windows". Программа осуществляет поиск в указанном или текущем каталоге. Поиск проходит по дереву каталогов, начиная с заданного
6
|
Ушел с форума
![]() 15840 / 7422 / 994
Регистрация: 11.11.2010
Сообщений: 13,385
|
|
25.06.2013, 13:20 [ТС] | 17 |
ОСНОВНЫЕ ПРАВИЛА НАПИСАНИЯ ПРОГРАММ НА ЯЗЫКЕ АССЕМБЛЕРА Данные правила относятся не только к программированию на языке ассемблера, но и к программированию на других языках. Может быть, их трудно понять, не имея навыка в программировании, но «незнание основ не освобождает от ответственности».Начинайте с комментариев Начните с написания инструкции для пользователя — для чего создается и каковы возможности вашей программы. А теперь немного усложните вашу инструкцию по применению вашей программы, подразумевая под «пользователем» программиста, использующего написанный вами код — зачастую этим программистом-исследователем будете вы сами. Акт записи на обычном языке описания того, что делает программа и что делает каждая функция в программе, является критическим шагом в мыслительном процессе. Хорошо построенное, грамматически правильное предложение — признак ясного мышления. Если вы не можете это записать, то велика вероятность того, что вы не полностью продумали задачу или метод ее решения. Плохая грамматика и построение предложения являются также показателем поверхностного мышления. Поэтому первый шаг в написании любой программы — записать, что именно и как делает программа. Итак, комментарии для вашей программы уже готовы. Теперь возьмите ваше описание по использованию и добавьте вслед за каждым абзацем блоки кода, реализующие функции, описанные в этом абзаце. Оправдание: «У меня не было времени, чтобы добавить комментарии» на самом деле означает — «Я писал этот код без проекта системы и у меня нет времени воспроизвести его». Если создатель программы не может воспроизвести идеи, воплощенные в программный проект, то кто же тогда сможет? Работа программиста состоит из двух частей: разработать приложение для пользователя и сделать возможным дальнейшее сопровождение программы. Единственный способ решить вторую часть задачи — комментировать код. Причем комментарии должны описывать не только, что делает код, но и предположения, принятый подход и причины, по которым вы выбрали именно его. Кроме того, необходимо, чтобы комментарии также соответствовали коду. Пишите код так, словно тот, кто будет заниматься его поддержкой, — опасный психопат, знающий где вы живете. Хотя вы можете считать, что ваш код полностью очевиден и может служить примером ясности, без правильных комментариев понять его постороннему достаточно трудно. Парадокс заключается в том, что спустя неделю вы сами можете оказаться в роли этого постороннего. Старайтесь использовать следующий подход при написании комментариев:
Читайте код Все писатели — это читатели. Вы учитесь, когда смотрите, что делают другие писатели. Я настоятельно рекомендую, чтобы, как минимум, члены группы программирования читали код друг у друга. Читатель может найти ошибки, которые вы не увидели, и подать мысль, как улучшить код. Для вас лучше присесть с коллегой и просто разобрать код строка за строкой, объясняя, что и как делается, получить какую-то обратную связь и совет. Для того чтобы подобное упражнение принесло пользу, автор кода не должен делать никаких предварительных пояснений. Читатель должен быть способен понимать код в процессе чтения. Если вам пришлось объяснять что-то вашему читателю, то это значит, что ваше объяснение должно быть в коде в качестве комментария. Добавьте этот комментарий, как только Вы его произнесли; не откладывайте этого до окончания просмотра.Разлагайте сложные проблемы на задачи меньшего размера На самом деле это также и правило литературного стиля. Если очень трудно объяснить точку зрения за один раз, то разбейте изложение на меньшие части и по очереди объясняйте каждую. То же самое назначение у глав в книге и параграфов в главе.Используйте язык полностью Некоторые программисты считают одним из недостатков языка ассемблера большее, по сравнению с языками высокого уровня, количество команд, но, по-моему, это одно из достоинств языка ассемблера.Проблема должна быть хорошо продумана перед тем, как она сможет быть решена Это относится не только к программированию на языке ассемблера.![]() Отредактируйте свой код. Программа должна писаться не менее двух раз Раньше, когда вы изучали в школе литературу, вам никогда не приходило в голову сдавать черновик письменного задания, если Вы, конечно, рассчитывали на оценку выше тройки. Тем не менее, многие компьютерные программы являются просто черновиками и содержат столько же ошибок, сколько и черновики ваших сочинений. Хороший код программы должен быть сначала написан, а затем отредактирован в целях улучшения (под «редактированием» имеется в виду «исправление»). Редактирование, как правило, приводит к сокращению кода, а небольшие программы выполняются быстрее.Оптимизация программ на языке ассемблера Итак ваша программа заработала, а теперь постарайтесь переделать ее так, чтобы она стала максимально компактной и в тоже время максимально быстродействующей.Такая оптимизация достигается в три этапа:
Для написания этого топика были использованы статьи из следующих книг
4
|
Ушел с форума
![]() 15840 / 7422 / 994
Регистрация: 11.11.2010
Сообщений: 13,385
|
|||||
25.06.2013, 15:13 [ТС] | 18 | ||||
Графика DOS. Двигаемся в тоннеле Tunnel - 256 bytes01-11-2002 256 bytes intro: realtime rendering, software rendering, MsDos, x86 real mode, assembler, demoscene Автор Iсigo Quñlez, взято здесь и немного доработано
|