Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

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.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
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
Отписаться
Убрать рекламу

В избранное