Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
RusFAQ.ru: программирование на языке Assembler
Информационный Канал Subscribe.Ru |
RusFAQ.ru: программирование на языке Assembler
Выпуск № 449
от 21.12.2002, 14:50
Администратор: Имя: Калашников О.А. URL: Информационный ресурс ICQ: 68951340 Россия, Москва |
О рассылке: Задано вопросов: 2222 Отправлено ответов: 6736 Активность: 303.1 %
|
Список экспертов, ответы которых опубликованы в данном выпуске |
Traish Статус: Доверительный Общий рейтинг: 131.09 [Подробней >>] |
Ayl Статус: Профессиональный Общий рейтинг: 117.33 [Подробней >>] |
baldr Статус: Профессиональный Общий рейтинг: 114.09 URL: Сайт об ОС DOS. Всем, кто любит эту ОС! [Подробней >>] |
Bob Johnson Статус: Профессиональный Общий рейтинг: 152.74 [Подробней >>] |
Maverick Статус: Профессиональный Общий рейтинг: 139.07 URL: Задачи по ассемблеру Телефон: 89039415024 (BeeLine GSM) [Подробней >>] |
igorash Статус: Профессиональный Общий рейтинг: 115.11 Телефон: 8(903)251-86-01 [Подробней >>] |
St Статус: Опытный Общий рейтинг: 115.09 [Подробней >>] |
GL Статус: Опытный Общий рейтинг: 103.55 [Подробней >>] |
Beeblebrox Статус: Профессиональный Общий рейтинг: 111.35 URL: Beeblebrox / TMA HomePage [Подробней >>] |
Gibbel Статус: Профессиональный Общий рейтинг: 108.44 URL: Страничка обо мне и моих друзьях [Подробней >>] |
LIFO Статус: Профессиональный Общий рейтинг: 120.45 URL: наш сайт Телефон: 8 01710 24758 [Подробней >>] |
Broken Sword Статус: Профессиональный Общий рейтинг: 127.68 URL: моя рассылка по Protected Mode [Подробней >>] |
Sensey Статус: Профессиональный Общий рейтинг: 122 URL: Страничка рассылки по Паскалю Телефон: +38 (0572) 41-76-04 дом. [Подробней >>] |
Краткий перечень вопросов |
Вопрос № 2168. Уважаемые эксперты. Готов признать свою ошибку в ДНК. Резидент запускается для DOS 6.22, но потом пр... (ответов: 3)
Вопрос № 2169. Здравствуйте. Я тут в каком-то вопросе видел упоминание SEH. Неподскажите ли вы, что это такое и как... (ответов: 2)
Вопрос № 2172. Пошлите мне пожалуйста chm с рассылкой калашникова (вот то особенно что касается винды) - ды вообще ... (ответов: 1)
Вопрос № 2173. Спасибо за ответы. Еще вопросик. Задача усложняется. Вместо того, чтоб открыть файл размером 13 байт... (ответов: 5)
Вопрос № 2174. На вопрос который задад. Высылаю примерный sources Повторяю вопрос Хочу сделать собственный басик бе... (ответов: 4)
Вопрос № 2175. Здравствуйте эксперты! Вопрос не совсем по АСМу, ну не в VB ж его слать ;)) Я недавно загорелся идее... (ответов: 3)
Вопрос № 2177. При размерности операндов 16 байты 66 50 50 дизассемблируются как 66 50 push eax 50 push ax Есл... (ответов: 7)
Вопросов: 7, ответов: 25
Вопрос № 2168 |
Уважаемые эксперты.
Готов признать свою ошибку в ДНК. Резидент запускается для DOS 6.22, но потом при запуске любой другой программы подвисает тачку наглухо.
Кратко суть программы. Для текущего каталога, по нажатию на клавишу проверяет наличие файла. Если файл есть, выводит в левом верхнем углу хендл, если нет, то выводит код ошибки.
Буду очень признателен.
Приложение:
Вопрос отправлен: 16.12.2002, 13:26
Отправитель: SLaViR
[Следующий вопрос >>] [Список вопросов]
Отвечает Traish
Добрый день, SLaViR!
Я написал обработчик прерывания, но не полностью - без вывода на экран (ну и, соответственно, преобразования), но думаю ты его сам допишешь.
Приложение:
Ответ отправлен: 16.12.2002, 20:50
Отправитель: Traish
Отвечает Ayl
Здравствуйте, SLaViR!
Только что отвечал на похожий вопрос. Нельзя из аппаратного прерывания просто так вызывать другое прерывание! В общем, смотри мой ответ на этой странице:
http://rusfaq.ru/cgi-bin/info.cgi?Action=GetQuestion&ID=7758966.0231024
Ответ отправлен: 16.12.2002, 20:17
Отправитель: Ayl
Отвечает baldr
Доброе время суток, SLaViR!
Короче, в обработчике прерывания, а тем более, 9h вызывать другие прерывания (а тем более 21h)
категорически запрещается. Можно сделать немного по-другому... Перед вызовом старого обработчика
клавиатуры положи в стек перед (то есть, ниже) адресом возврата из прерывания реальный адрес
возврата, а тот адрес, на который будет передано управление после отработки прерывания, замени
на адрес процедуры, которая будет выполнять всякие твои действия, например, работу с файлом.
После отработки прерывания управление автоматом передастся этой твоей процедуре, которая будет
находиться уже вне обработчика, а после ее отработки ее команда ret вернет управление на
старый адрес, с которого и произошло прерывание.
Ответ отправлен: 17.12.2002, 00:13
Отправитель: baldr
Вопрос № 2169 |
Здравствуйте.
Я тут в каком-то вопросе видел упоминание SEH. Неподскажите ли вы, что это такое и как им пользоваться?
Вопрос отправлен: 16.12.2002, 17:34
Отправитель: Igor Tihoncuk
[Следующий вопрос >>] [Список вопросов]
Отвечает Bob Johnson
Приветствую Вас, Igor Tihoncuk!
SEH = Structured Exception Handling - обработка исключений. Если ты пишешь прогу под винды на ассемблере и там у тебя будет команда, например, div edx, которая всегда вызывает переполнение, то ты увидишь "программа выполнила некорректную операцию и будет закрыта". А если необходимо продолжить работу, то устанавливается свой обработчик SEH, который, обычно показывает сообщение пользователю и возвращает управление Message Loop'у. Тогда просто ветвь кода, вызвавшая ошибку не будет выполнена, а сама программа продолжит работу.
Ответ отправлен: 17.12.2002, 19:52
Отправитель: Bob Johnson
Отвечает Traish
Здравствуйте, Igor Tihoncuk!
Ты еще не знаешь, что это такое, а уже спрашиваешь "как?"?
SEH - это Structured Exception Handling. По нему лучше почитать соответствующую документацию, но коротко так:
fs:[0] указывает на начало так называемого THREAD INFORMATION BLOCK (Блока информации о потоке) и по fs:[0] начинается список из структур _EXCEPTION_REGISTRATION_RECORD, каждая из которых содержит указатели на текущий обработчик и предыдущий. И если возникнет исключение, то будут вызываться все обработчики по цепочке, пока какой-нибудь из них не возьмет на себя обработку этого исключения.
Ответ отправлен: 16.12.2002, 21:12
Отправитель: Traish
Вопрос № 2172 |
Пошлите мне пожалуйста chm с рассылкой калашникова (вот то особенно что касается винды) - ды вообще всё что есть касаемо этой рассылки - и про вирусы тоже. Ящик у меня большой.
с уважением, эдвард.
Вопрос отправлен: 16.12.2002, 22:56
Отправитель: Edrward (edsam@spidernet.com.cy)
[Следующий вопрос >>] [Список вопросов]
Отвечает Maverick
Добрый день, Edrward!
Базаров нет, ящики у всех большие, только инет не у всех бесплатный :)
Шлю chm.
Насчет вирей и доков, гляди на www.wasm.ru там большинство статей есть.
А вот когда серьезно начнешь интересоваться этой темой и покажешь успехи, тогда поделюсь самым сокровенным :)
Ответ отправлен: 17.12.2002, 05:15
Отправитель: Maverick
Вопрос № 2173 |
Спасибо за ответы. Еще вопросик.
Задача усложняется. Вместо того, чтоб открыть файл размером 13 байт, открываем файл с неизвестным количеством байтов. Как узнать величину файла (желательно, в байтах) ?
Вопрос отправлен: 16.12.2002, 23:31
Отправитель: Faraon
[Следующий вопрос >>] [Список вопросов]
Отвечает igorash
Доброе время суток, Faraon!
Есть такое прерывание - 21h, есть у него функция - 4Eh - найти первый файл, указываешь в качестве шаблона имя файла (по адресу ds:dx asciiz-строка с шаблоном), в cx - шаблон атрибутов, вызываешь прерывание, затем если cf=0, т.е. все ок, то по адресу DTA+1Ah находится размер файла - dword... (dta по умолчанию по адресу ds:0080h)
Ответ отправлен: 16.12.2002, 23:55
Отправитель: igorash
Отвечает Ayl
Здравствуйте, Faraon!
1. Открываешь файл
2. Вызываешь функцию 42h с параметрами:
AX = 4202h
BX = file handle
CX = DX = 0
В результате в регистрах DX:AX получаешь длину файла в байтах (если флаг CF сброшен). Если CF = 1, то произошла ошибка, код ошибки в регистре AX.
Ответ отправлен: 17.12.2002, 00:26
Отправитель: Ayl
Отвечает Maverick
Добрый день, Faraon!
Если ты этот файл ищешь, например ф-ей 4eh, то можно выдернуть из dta:
mov cx,cs:[09ah]
Вот в CX и будет размер в байтах.
Ответ отправлен: 17.12.2002, 05:15
Отправитель: Maverick
Отвечает Traish
Здравствуйте, Faraon!
Устанавливаешь файловый указатель на конец файла и получаешь длину в DX:AX (дествительная_длина=(DX * 65536) + AX.
Ответ отправлен: 17.12.2002, 09:21
Отправитель: Traish
Отвечает Bob Johnson
Доброе время суток, Faraon!
Можешь читать свой файл блоками по сколько-то байт. При этом каждый раз смотреть, если число прочитанных байт меньше, чем то, сколько ты заказал - значит файл закончился. Тогда размер буфера необходимо выбирать исходя из того, сколько байт ты будешь читать за раз.
Ответ отправлен: 18.12.2002, 18:16
Отправитель: Bob Johnson
Вопрос № 2174 |
На вопрос который задад.
Высылаю примерный sources
Повторяю вопрос
Хочу сделать собственный басик без всяких фат
как мне это сделать
бут сектор грузится в опред область
как это сделать в масме чтоб он понимал что это адрес 07C00??
Приложение:
Вопрос отправлен: 17.12.2002, 00:32
Отправитель: Switcher
[Следующий вопрос >>] [Список вопросов]
Отвечает St
Привет, Switcher!
Извините, но не понятно что вы хотите сделать. Если вы планируете сделать запускной файл и запускать его из под доса то обращаться к области памяти 0000:7C00h не стоит, у меня это приводило к зависанию системы, а если свой загрузочный сектор, то нужно следовать его формату, да и размер его ограничен 512 байтами. В последнем случае даже Б. Гейтс не смог бы запихать туда свой бейсик (он был насколько помню около 2 кБ :).
В начале бут-сектора после jump-а на исполняемый код описывается заголовок со некими сведениями а к конце обязательно находятся два байта - 55 AA, по этой сигнатуре и определяется, что это бут-сектор. При загрузке с диска бут сектор грузится программкой сидящей в MBR (partition table) а с дискеты самим биосом. Так что, как мне кажется, написать и скомпилировать программу-бут-сектор на масме не удастся, проще модифицировать реальный бут-сектор.
Насчет того как сделать чтоб в обычной программе под дос исполнялся ваш код по адресу 0000:7C00h, то его надо туда скопировать и затем передать управление с помощью far jump (но делать это не стоит). Например код находящийся в MBR делает следущее - он изначельно грузится по адресу 0000:7C00h, но затем освобождает его для последующей загрузки туда (в 0000:7C00h) бут-сектора, путем пересылки себя по адресу 0000:0600h, и передачей управления самому себе уже в новом местоположении.
Так что повторяю предложение поподробнее объяснить идею задачи, тогда попытаюсь посоветовать что-нибудь конкретное.
Также если можно объясните пожалуйста, что значит "без всяких фат"?
St
Ответ отправлен: 17.12.2002, 13:28
Отправитель: St
Отвечает Traish
Доброе время суток, Switcher!
Я ведь уже тебе говорил, кажется, что надо либо от адреса ячейки памяти отнимать 100h или изменять ds, т.к. если твоя прога записывается в 0000:7с00h, то это не значит, что при старте ip будет равен 7c00h - он будет равен 0.
Ответ отправлен: 17.12.2002, 19:54
Отправитель: Traish
Отвечает Maverick
Доброе время суток, Switcher!
Я не стал разбираться в твоем коде, так как эта тема нова для меня. Как получил вопрос, так и сел разбираться с загрузочными секторами :)
Короче наваял простейшую прогу(туповатую), короче пихаешь дискету в дисковод, запускаешь прогу, и грузишся с дискеты, на экран вылазиют символы *.
По крайней мере ты поймешь принцип записи в boot.
!!!Сектор должен заканчиваться словом 55AAh обязательно!!!
Приложение:
Ответ отправлен: 17.12.2002, 09:10
Отправитель: Maverick
Отвечает Ayl
Здравствуйте, Switcher!
Мда... Ну-ну, пиши... Ты хоть в листинге пытался смотреть, что у тебя получается после компиляции? И на размер COM-файла? И это у тебя в бут-сектор влезет?
Да, бут-сектор загружается в память по адресу 0:7c00h. Но это не значит, что CS=0, IP=7c00. На самом деле регистры устанавливаются так: CS=07c0, IP=0.
В связи с этим, у тебя должно быть написано в программе:
ORG 0.
Ты хоть разбирался со структурой бут-сектора? Первые 2 байта (0EBh, 03Eh) - это короткий переход на начало программы. Для обхода блока описания диска.
Как надо было писать.
В приложении - шаблон программы.
Далее. Ты пишешь int 20h для завершения. А головой подумать? Как ты собираешься завершаться? У тебя DOS есть? У тебя командный интерпретатор есть? У тебя вообще что-то, кроме голого железа есть?
Во-первых, int 20h - это DOS-овское прерывание. Мало того, что оно требует корректного PSP и существование MCB-блоков. Так оно еще и не функционирует, потому что обработчика нет. В лучшем случае, по этому вектору записан iret.
Во-вторых, кому ты собрался передавать управление? У тебя операционки-то нет!
В общем, или ты полностью заменяешь собой DOS (Windows, *nux и т.п.), или будь добр после выполнения своей программы запустить какую-нибудь операционку. Для этого проще всего сохранить оригинальный бут-сектор и в нужное время загрузить его в память по адресу 07c0:0 и передать ему управление.
В своей работе ты имеешь право использовать только функции BIOS. Про DOS забудь! Если тебе надо работать с файлом - работай через прерывание 13h - на уровне секторов. И т.п.
Приложение:
Ответ отправлен: 17.12.2002, 11:35
Отправитель: Ayl
Вопрос № 2175 |
Здравствуйте эксперты!
Вопрос не совсем по АСМу, ну не в VB ж его слать ;))
Я недавно загорелся идеей собрать FM - тюнер.
Пока меня интересует аппаратная реализация этой системы
и сопряжение с ПК.
Подскажите пожалуйста с какого места начать копать.
Прошу ногами не пинать, опыта в плане создания и
реализации таких систем пока не имею.
Недавно проскакивал вопрос относительно
программирования PIC-контроллеров, и по-моему
BeebleBrox ответил, что занимался подобным, значит
у кого-то опыт есть.
--
С уважением,
Atma
Вопрос отправлен: 17.12.2002, 03:01
Отправитель: Atma Manas (atma_manas@mtu-net.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает GL
Приветствую Вас, Atma Manas!
Сначала нужно определиться, как подключить тюнер к компьютеру. Самый простой способ - через разъём ISA. Но в современных платах этот разъём зачастую отсутствует. По подключению через PCI у меня нет опыта.
Вообще, задача сводится к подключению к какому-либо IRQ, через которое и будет управляться тюнер (менять напряжение на варикапах).
Ответ отправлен: 17.12.2002, 13:11
Отправитель: GL
Отвечает Beeblebrox
Добрый день, Atma Manas!
Мой опыт работы с FM-тюнерами сводится к тому, что я спаял "эмулятор" ISA-шины, подключаемый через LPT-порт и написал новый драйвер для ISA тюнера Aztech (Packard Bell).
Все необходимые данные можно найти в интернете
Ответ отправлен: 17.12.2002, 10:21
Отправитель: Beeblebrox
Отвечает Bob Johnson
Приветствую Вас, Atma Manas!
А почему бы тебе не купить готовый FM-тюнер? Или тут уже чисто в интересе дело. Тогда так. Берешь готовый FM-приемник с настройкой в помощью варикапов (или делаешь сам, если уж совсем хочется). Далее читаешь документацию по PCI (я думаю на PCI будешь делать) и собираешь устройство. PIC-контроллер тут совсем не обязателен. Что там должно быть - один или два регистра для хранения данных + some stuff для работы PCI. На выход одного ставишь ЦАП и подаешь напряжение с него на вход настройки варикапов. На выход второго - все, что угодно, например, отключение звука и все такое.
Аналоговый выход со стереодекодера подаешь на вход (например, AUX) звуковой карты. Вот примерно и все.
Далее, если под винды - пишешь драйвер, который передает данные в регистры твоего устройства.
Но проще будет подключать свое устройство не к PCI, а к параллельному порту, т.к. для PCI тебе еще и плату свою делать придется.
Ответ отправлен: 18.12.2002, 18:16
Отправитель: Bob Johnson
Вопрос № 2177 |
При размерности операндов 16 байты 66 50 50 дизассемблируются как
66 50 push eax
50 push ax
Если размерность 32 - с точностью до наоборот:
66 50 push ax
50 push eax
Забавно.
Вопрос отправлен: 17.12.2002, 14:46
Отправитель: [stl] (progressor@ngs.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Gibbel
Приветствую Вас, [stl]!
66h - это префикс, указывающий в 16-битном режиме на то, что операнды 32-битные и наоборот, в 32-битном режиме, что операнды 16-битные.
Ответ отправлен: 17.12.2002, 17:03
Отправитель: Gibbel
Отвечает LIFO
Здравствуйте, [stl]!
И чего ты тут нашел сверхестественного?
Дизассемблер увидев 66 наверное подумает о префиксе размерности(наверное слышал о таком) и покажет тебе соотвествующие команды. А именно если у тебя 32-разряда, то увидев 66, он изменит размер на 16.
Ответ отправлен: 17.12.2002, 17:01
Отправитель: LIFO
Отвечает Ayl
Добрый день, [stl]!
А чего забавного-то? Ровно в соответствии с описанием.
Префикс 66 - это префикс размера операнда. Он изменяет размер операнда по умолчанию в соответствии с правилом:
р.о. по умолч. 16 бит - (66) -> р.о. 32 бит
р.о. по умолч. 32 бит - (66) -> р.о. 16 бит
Соответственно, при р.о. 16 бит используются регистры ax, bx, cx и т.д., а при 32 битах - eax, ebx, ecx и т.д.
Или я не поня юмора вопроса? :-)
Ответ отправлен: 17.12.2002, 15:05
Отправитель: Ayl
Отвечает Broken Sword
Здравствуйте, [stl]!
а чего ж тут забавного? так и должно быть. Даже бит в дескрипторе сегмента (бит D/B) для сегментов кода именно для этого и существует (если установлен - подразумеваются 32-х битные адреса и 32-х битные или 8-битные операнды, если сброшен - 16 битные адреса и 16-битные или 8-битные операнды).
Кстати, префиксы 66h и 67h все это дело инвертируют
Ответ отправлен: 17.12.2002, 17:54
Отправитель: Broken Sword
Отвечает Sensey
Доброе время суток, [stl]!
И чего забавного?
Код 66 - переключение разрядности...
Ответ отправлен: 17.12.2002, 15:35
Отправитель: Sensey
Отвечает Traish
Приветствую Вас, [stl]!
Ничего тут удивительного. Префикс siz для того и создан.
Ответ отправлен: 17.12.2002, 15:49
Отправитель: Traish
Отвечает Bob Johnson
Доброе время суток, [stl]!
А что тут забавного??? код 66h меняет размерность операнда в следующей команде - если была 32, станет 16, была 16 - станет 32...
Ответ отправлен: 18.12.2002, 18:16
Отправитель: Bob Johnson
Форма отправки вопроса |
Форма может работать некорректно в почтовых программах "Microsoft Outlook" и "Microsoft Outlook Express". В программе The Bat! подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте, что в некоторых браузерах могут стоять запреты на открытие других окон, а также "чрезмерное" кэширование данных, при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.
© 2002 Команда RusFAQ.ru.
Вопрос и дополнение |
Ваш вопрос:
Приложение (если необходимо):
Получить ответов:
Выбор рассылки |
Программисту Assembler (39) C / C++ (30) Perl (5) Delphi (21) Pascal (23) Basic / VBA (10) Java / JavaScript (6) PHP (4) MySQL / MSSQL (5) |
Пользователю Windows 95/98/Me (32) Windows NT/2000/XP (26) "Железо" (32) Поиск информации (14) |
Администратору Windows NT/2000/XP (10) Linux / Unix (14) |
Юристу Гражданское право (8) Семейное право (3) Трудовое право (5) КоАП (2) |
Отправить вопрос всем экспертам выбранной рассылки.
© 2002 Россия, Москва. Авторское право: RusFAQ.ru |
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||