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

RusFAQ.ru: программирование на языке Assembler


Служба Рассылок Subscribe.Ru

"Ассемблер? Это просто! Учимся программировать (FAQ)"

Выпуск № 240
от 10.04.2002, 02:05

Администратор: Калашников Олег
Сайт Администратора: Программирование на Ассемблере


Старейшины рассылки
(по состоянию на 10.04.2002, 02:05)

1. Broken Sword - ответов: 431.
2. Painbringer (нечто наподобие домашней страницы) - ответов: 378.
3. Sensey - ответов: 352.
4. Dron (Операционная система с нуля!) - ответов: 319.
5. DiGiT - ответов: 316.



 Вопрос № 24

здравствуйте !!!
...
mov cx,0FF00h
mov dx,offset Buffer
....
Buffer equ $
Немогу понять эти строчки:(( в отладчике нечего не понять помоги пожалуйста.
Для чего занасить в CX 0FF00h ( и что это такое 0FF00h??) и откуда берем адрес для buffer. Под отладчиком не вижу этого адреса??!!
Разясните , а то очень трудно понять.
Спасибо за внимание

Приложение:


Отправитель: Алекс
Вопрос отправлен: 05.04.2002, 02:57
Подгруппа: Общие вопросы по программированию на Ассемблере под DOS

_______________

Отвечает Dron
Приветствую Вас, Алекс!

$ - это символ ассемблера, который хранит в себе текущее смещение. написав Buffer equ $ мы тем самым присваивает переменной Buffer значение текущего смещения в сегменте.

Для чего в cx засылается 0ff00h по тому куску, который ты представил, ничего сказать нельзя.


Отправлено: 05.04.2002, 11:13
Отправитель: Dron (регистрация: 28/12/2001, ответов на счету: 319)
Информзащита
Адрес: Москва
URL: http://asmdev.narod.ru/asmos.html - Операционная система с нуля!
2144510
Россия, Москва

_______________

Отвечает Beeblebrox
Добрый день, Алекс!
$ означает текущий адрес трансляции. Указанный тобой пример программы - плохой для понимания, старайся так не делать. Ведь нет ничего проще:
Buffer db 0FF00h dup(?)
Второй твой вопрос - что означает mov cx,0FF00h
Это просто размер в байтах (в шестнадцатиричном виде) куска файла, который читаем в буфер. То есть 65536-256=65280 в десятичном.


Отправлено: 05.04.2002, 12:52
Отправитель: Beeblebrox (регистрация: 13/03/2002, ответов на счету: 61)
URL: http://beeblbrx.narod.ru - Beeblebrox / TMA HomePage
ICQ #75393045
Ukraine, Kharkov

_______________

Отвечает Scientia Cupidus
Добрый день, Алекс!
Когда читаешь файл через 3Fh, в CX должно быть число считываемых байт - в данном случае 0FF00h или 65280 в десятичной. Дальше: знак $ при компиляции заменяется на текущий адрес, а значит файл будет загружен в память сразу за последним байтом кода твоей программы, т.к. строка
buffer equ $ стоит в самом конце.


Отправлено: 05.04.2002, 13:42
Отправитель: Scientia Cupidus (регистрация: 01/04/2002, ответов на счету: 20)
Россия

_______________

Отвечает Broken Sword
Здравствуйте, Алекс!
ну че тут непонятного? ну файл читают в оперативу с винта, ну и что тут такого? в cx-сколька нада прочитать байт (0FF00h), а в dx-КУДА читать. А buffer equ $ - это для понта :) можно обойтись простым buffer: (т.е. это та же метка, только выполнена с размахом и претензией ))


Отправлено: 05.04.2002, 23:27
Отправитель: Broken Sword (регистрация: 28/12/2001, ответов на счету: 431)
ICQ#64476575
Украина, Одесса

_______________

Отвечает GL
Приветствую Вас, Алекс!
0FF00h в CX означает, сколько байт мы будем читать из файла (смотри описание функции 3Fh (int 21h) - чтение из файла).
Адрес для буфера указывается строкой "Buffer equ $", т.е. буфер у нас начинается сразу после кода программы.
Замечание:
в данной программе значение 0FF00h по-моему слишком велико, и если файл msdos.sys будет такого размера, то мы затрем стек, что может привести к непредсказуемым результатам. Безопасную длину буфера (количество читаемых байтов из файла) можно вычислить так:
Длина буфера = 0FFFFh(длина сегмента) - 0FFh(PSP) - (длина нашей программы) - (длина стека).


Отправлено: 06.04.2002, 12:14
Отправитель: GL (регистрация: 02/03/2002, ответов на счету: 49)
Амурская обл., Благовещенск

_______________

Отвечает Frank
Здравствуйте, Алекс!
В CX мы заносим кол-во байтов, которые хотим считать из файла. в DX заносим смещение переменной Buffer, т.е. ее адрес. Сама переменная объявлена в конце файла. т.е. когда мы будем читать байтики из файлика они будут размещены в памяти сразу за нашей программой. Строка Buffer equ $ означает что в buffer будет значение смещения этого участка проги относительно начала.


Отправлено: 07.04.2002, 08:59
Отправитель: Frank (регистрация: 14/01/2002, ответов на счету: 156)
КПИ,ФЭЛ,ДА-02
ICQ: 100341415 E-mail: Frank_U@mail.ru
Украина, Киев

_______________

Отвечает Ayl
Добрый день, Алекс!

Для чего заносить? А потому что этого требует функция 3fh
21-го прерывания. Вот, берем справочник по функциям DOS и читаем:
Функция 3fh Int 21h. Чтение из файла с помощью дескриптора.
Входящие параметры:
AH = 3fh
BX = дескриптор файла
CX = количество байт для чтения
DS:DX = буфер для сохранени прочитанных байт
Возвращаемые параметры:
AX = код ошибки, если флаг переноса установлен
количество реально прочитанных байт, если флаг переноса сброшен.

Соответственно, в регистр CX заносится значение 0ffOOh - максимальное числа байт, которое может быть прочитано из файла.

В регистр DX загружается адрес, соответствующий первому байту за нашей программой. Достигается это описанием константы:
Buffer EQU $

В компиляторе знак $ обозначает текущее значение счетчика команд. Соответственно при компиляции вчесто $ будет подставлено реальное значение этого счетчика. Описание константы производится в самом конце программы, поэтому то туда и будет записан адрес, соответствующий первому байту за нашей программой.

В результате под буфер отводится вся память за пределами нашей программе. Вот туда и будут помещены данные из файла.


Отправлено: 08.04.2002, 12:45
Отправитель: Ayl (регистрация: 28/12/2001, ответов на счету: 211)
Россия, Санкт-Петербург




 Вопрос № 22

Здравствуйте, эксперты!
Подскажите, плз, правильно ли я мыслю. Допустим, я написал прогу, которая заставляет головки винта читать какие-нить сектора, которые находятся на ближнем от центра поверхности треке и на дальнем. И эту процедуру я зациклил до бесконечности, т.е. сперва прочтет сектор на ближнем треке, затем на дальнем, снова на ближнем, и т.д. Так вот при этом головки винта перемещаются туда-сюда. Могут ли таким образом полететь головки винта(из-за силы трения), и, следовательно сам винт, или система просто зависнет?

Большое спасибо.

Отправитель: Эдуард
Вопрос отправлен: 04.04.2002, 23:20
Подгруппа: Общие вопросы по программированию на Ассемблере под DOS

_______________

Отвечает DiGiT
Добрый день, Эдуард!
Они ведь не трутся о поверхность винта инче и то и то бы давно полетели . т.е. просто стерлись бы. Они над поверхностью летают. А они так и воркают при большой нагрузке и фрагментации.


Отправлено: 05.04.2002, 01:59
Отправитель: DiGiT (регистрация: 28/12/2001, ответов на счету: 316)
ICQ:133534725
Russia(),Student

_______________

Отвечает BMR
Здравствуйте, Эдуард!
А в винтах головки не трутся, они "висят" над поверхностью диска и головки ходят не поперёк диска, а по касательной. Гоняя их можно быстрее вывести из строя механизм управления.


Отправлено: 05.04.2002, 02:02
Отправитель: BMR (регистрация: 10/02/2002, ответов на счету: 111)
Россия, Пенза




 Вопрос № 23

Привет, уважаемые експерты и др.

Сразу приношу свои извинения за нетерпеливость в изучении асма (чит. DOS). Тоесть я асм типа знаю, но пока не на том уровне, на котором бы хотелось. Уверен, если бы прочитал до конца рассылку, то сам бы все и понял, и не задавал бы ламерских вопросов. Так вот, вопрос в том, насколько реентабельны (или как это назвывается) функции int 21h и др., тоесть всегда ли можно со спокойной совестю так писать как в прилож. Или чтобы спать спокойно таки надо раскоментировать?

Приложение:


Отправитель: Бадян (sba@litech.net)
Вопрос отправлен: 05.04.2002, 01:36
Подгруппа: Общие вопросы по программированию на Ассемблере под DOS

_______________

Отвечает VicSimon
Приветствую Вас, Бадян!
Прерывания MS-DOS по заявлениям Мелкософта НЕ реентерабельны (по-английски: re-enter-able - в приближенном переводе значит "способны к рекурсии"). В особенности это применимо к прерыванию 21h...


Отправлено: 05.04.2002, 05:30
Отправитель: VicSimon (регистрация: 25/01/2002, ответов на счету: 48)
Россия, Красноярск

_______________

Отвечает freeseacher
Здравствуйте, Бадян!
ну ежели ты демон, то конечно можно! Ежели ты просотй смертный, то лучше не надо так писать, а то через неделю свой код не прочитаешь... Можно еще лучше извратиться и имена буферам и хендлам присваивать при помощи прог которые генерируют пароли, типа "E6!vt4_c96QeG" А ежели ты демон, то вообще нафига тебе эти компиляторы, ты не пробовал сразу в опкодах писать???


Отправлено: 05.04.2002, 06:25
Отправитель: freeseacher (регистрация: 03/02/2002, ответов на счету: 68)
Тел.: 8(3832)366362
Новосибирск

_______________

Отвечает Dron
Здравствуйте, Бадян!

Не понял смысла... что по твоему есть реентерабельность???
по моему это когда одна функция будучи вызвана, прерывается прерыванием к премеру (ну это я про дос) которое опять пытается вызвать ее же. этого дос не переваривает. там есть некоторая функция по этому поводу... получить флаг реентреабельности DOS.

Ну а в том примере, который ты написал, я не вижу никакой реентерабельности.. последовательное выполнение нескольких функций. и все.

Кстати реентерабельность от английского reenterable, или как это по английски то? :))


Отправлено: 05.04.2002, 11:10
Отправитель: Dron (регистрация: 28/12/2001, ответов на счету: 319)
Информзащита
Адрес: Москва
URL: http://asmdev.narod.ru/asmos.html - Операционная система с нуля!
2144510
Россия, Москва

_______________

Отвечает Beeblebrox
Приветствую Вас, Бадян!
Раскомментируй. Ты потеряешь 5 байт, но избавишься от головной боли. Инты не обязаны хранить регистры


Отправлено: 05.04.2002, 12:41
Отправитель: Beeblebrox (регистрация: 13/03/2002, ответов на счету: 61)
URL: http://beeblbrx.narod.ru - Beeblebrox / TMA HomePage
ICQ #75393045
Ukraine, Kharkov

_______________

Отвечает Scientia Cupidus
Здравствуйте, Бадян!
В приведенном примере не надо никого раскомментировывать :) , т.к. на выходе ф-ции 42h из int 21h имеем:
AX - код ошибки, если она есть;
DX:AX - новая позиция указателя (в твоей проге - нулик);
BX тоже никто не портит, так что живи спокойно.
А насчет остальных ф-ций - надо всегда смотреть что на выходе (InterruptList или TechHelp есть?), да и все.



Отправлено: 05.04.2002, 13:42
Отправитель: Scientia Cupidus (регистрация: 01/04/2002, ответов на счету: 20)
Россия

_______________

Отвечает Broken Sword
Доброе время суток, Бадян!
) ну во-первых, реентабельны-это вообще не из той оперы, если уж на то пошло, то реентерабельны (re-enter -перезайти :). Но и это все не из той степи.

В твоем приложении дело обстоит так: 42h ф-ция может изменить только значения DX и AX и флага CF, поэтому mov bx, hFile уже явно не в тему. И далее - в твоем примере DX будет равен 0 по любому, кроме, разумеется, ошибки, но и в этом случае беспонтово его обнулять (все равно указатель не туда будет тыкать) А вообще ты что-то странное замутил: если это com-файл и ты предварительно не поизменял сегм. регистры и файло у тебя больше 100h байт, то ты затрешь сам себя... и все повиснет к матери


Отправлено: 05.04.2002, 23:27
Отправитель: Broken Sword (регистрация: 28/12/2001, ответов на счету: 431)
ICQ#64476575
Украина, Одесса

_______________

Отвечает Топор


Добрый день, Бадян!


К сожалению, все прерывания DOS нереентерабельны.


Отправлено: 06.04.2002, 08:43
Отправитель: Топор (регистрация: 15/03/2002, ответов на счету: 62)
Радио "Эхо Москвы в Самаре"
Адрес: 443011, Самара, ул. Советской Армии, 217
Тел.: (8462)160302, 162918
URL: http://listen.to/btemple - Хорошая Русская Металлическая команда
Россия, Самара

_______________

Отвечает Пуля
Здравствуйте, Бадян!
Любое уважающее себя прерывание восстанавливает регистры, которые были до его выполнения. То есть с чистой совестью можно оставить все как есть.
Но я вам порекомендую все-таки раскомментировать.
Зачем ? Просто если вы между этими двумя вызовами поставите еще чего-нибудь, то можете и забыть что регистры-то у вас заняты. Серьезно, я так "пролетал" не раз.

Удачи !


Отправлено: 06.04.2002, 10:49
Отправитель: Пуля (регистрация: 25/03/2002, ответов на счету: 23)
URL: http:\\www.1c.ru - Windows Must Die
Россия, Омск

_______________

Отвечает GL
Доброе время суток, Бадян!
Конечно здесь речь идёт не о реентерабельности, а о сохранении значений в регистрах после исполнения прерывания. Если важна надёжность, то лучше перестраховаться и раскомментировать строки.
В другом случае, прогони свою программу (закомментированную) через AFD-шку и понаблюдай за сохранностью содержимого регистров после исполнения прерываний.


Отправлено: 06.04.2002, 12:15
Отправитель: GL (регистрация: 02/03/2002, ответов на счету: 49)
Амурская обл., Благовещенск

_______________

Отвечает Frank
Доброе время суток, Бадян!
Для начала когда файл открывается, то указатель автоматически устанавливается на начало файла. А вот если ты его открыл, потом что-то там с ним делал то тогда правильно установить указатель на начало файла. Но после того как ты установил указатель на начало после выполнения собсно прерывания в
регистрах DX:AX расположено новое положение указателя на файл.
т.е. установка указателя пройдет нормально. А вот при чтении ты делаешь так: в BX тот же handle файла а вот в DX у тебя проблема если его не обнулять то в нем будет старшая часть положения указателя на файл а если его обнулить, то где же твой буфер для чтения???
Основной принцип такой - всегда смотри что у тебя возвращается после выполнения прерывания и в каких
регистрах !!!


Отправлено: 07.04.2002, 08:57
Отправитель: Frank (регистрация: 14/01/2002, ответов на счету: 156)
КПИ,ФЭЛ,ДА-02
ICQ: 100341415 E-mail: Frank_U@mail.ru
Украина, Киев

_______________

Отвечает Ayl
Добрый день, Бадян!

Вообще-то можно не ставить, потому как контекст программы обязан сохраняться, а прерывание гарантирует, что изменяется только dx:ax. Но так как новая позиция в файле должна быть 0, то dx=0. А вот на ошибку все-таки проверить нужно. Т.е. перед командой
mov ah, 3fh
надо поставить команду:
jc Error

И к реентерабельности этот вопрос не имеет никакого отношения.


Отправлено: 08.04.2002, 12:25
Отправитель: Ayl (регистрация: 28/12/2001, ответов на счету: 211)
Россия, Санкт-Петербург




 Вопрос № 25

Здравствуйте ув. эксперты, У меня такой вопрос...вернее проблемма, не инсталица 2000 масдай.Вернее не инсталлилась . Сначала мне сказали что проблемма может быть в мамке...(6BX/VIA/ZX8_ver 1.7, Acorp) , Но потом оказалось что м.б. проблемма в звуковой_карточке и после её замены винда всётаки встала, но криво.При каждой попытки проинсталлировать ту или иную прогу она вылетает_с синим экраном, иногда и просто так вылетает.А может ей оперативки мало, т.е хотелось бы знать_наверняка реагирует ли она так именно на надостаток ОЗУ (у меня 64)
З.Ы. 200винда очень нужна т.к. без неё не прёт лицензионная прога.

Отправитель: MishaS
Вопрос отправлен: 05.04.2002, 03:53
Подгруппа: Пользовательская работа с Windows

_______________

Отвечает T_N_T
Добрый день, MishaS!
А проблема может быть еще в памяти. Запустите msconfig.exe, на вкладке Дополнительно поставьте галочку напротив Ограничить память до... и уменьшайте значение до тех пор, пока глюк не исчезнет. Извините, т.к. глюк может быть не из-за памяти.
Спасибо за вопрос.


Отправлено: 05.04.2002, 04:46
Отправитель: T_N_T (регистрация: 04/04/2002, ответов на счету: 10)
Россия, Братск

_______________

Отвечает Ghost
Приветствую Вас, MishaS!
Вообщето оперативки маловато, тем более для 2000 винды, папробуй увеличить файл подкачки если канечно винт позволяет, а вообще его нужно зделать фиксированным!
Вываливаться она у тя может из-за не достатка дров под какоето устройство.


Отправлено: 05.04.2002, 11:16
Отправитель: Ghost (регистрация: 30/03/2002, ответов на счету: 21)
ua, Odessa




 Вопрос № 26

Как прочитать содержимое ПЗУ BIOS?
Отправитель: Сергей
Вопрос отправлен: 05.04.2002, 04:07
Подгруппа: Общие вопросы по программированию на Ассемблере под DOS

_______________

Отвечает Beeblebrox
Здравствуйте, Сергей!
Например, так
push 0F000h
pop ds
mov ax,byte ptr [100h] ; чтение байта из ячейки 0F000h:0100h


Отправлено: 05.04.2002, 12:56
Отправитель: Beeblebrox (регистрация: 13/03/2002, ответов на счету: 61)
URL: http://beeblbrx.narod.ru - Beeblebrox / TMA HomePage
ICQ #75393045
Ukraine, Kharkov

_______________

Отвечает Топор
Доброе время суток, Сергей!

Посылаю прогу (см. приложение, извиняюсь, что без комментариев). Создаёт файл с расширением *.grb, потом можно его дизассемблировать как COM. В командную строку - номер вектора в 16ричном виде.

Удачи !


Приложение:


Отправлено: 06.04.2002, 08:39
Отправитель: Топор (регистрация: 15/03/2002, ответов на счету: 62)
Радио "Эхо Москвы в Самаре"
Адрес: 443011, Самара, ул. Советской Армии, 217
Тел.: (8462)160302, 162918
URL: http://listen.to/btemple - Хорошая Русская Металлическая команда
Россия, Самара

_______________

Отвечает Пуля
Добрый день, Сергей!
Насколько я знаю биос читается напрямую с сегмента E000.
До кучи пример чтения нулевого байта CMOS'a (может вам все-таки CMOS нужен был...)

Удачи !


Приложение:


Отправлено: 06.04.2002, 10:48
Отправитель: Пуля (регистрация: 25/03/2002, ответов на счету: 23)
URL: http:\\www.1c.ru - Windows Must Die
Россия, Омск




 Вопрос № 28

Здравствуйте эксперты.
Подскажите, пожалуйста какие службы висят на ah=E3h int 21h и на ah=4 int 60h. Если не затруднит, дайте ссылку на ресурс в интернете по данному вопросу.

Отправитель: Слава
Вопрос отправлен: 05.04.2002, 06:00
Подгруппа: Общие вопросы по программированию на Ассемблере под Win32

_______________

Отвечает Dron
Приветствую Вас, Слава!

Interrupt list Ральфа Брауна.
TechHelp по этому поводу бесполезен.

int 21h, fn 0e3h
Очень много чего может на ней висеть...
может висеть Novell, Может висеть DoubleDOS (что за хрень такая? :)

У новела там кстати еще куча подфункций...

int 60h, fn 04h
Может использоваться к примеру:
FTP packet driver,
MDEBUG (Что за хрень такая? :)
SYS_PROF.EXE

Разбирайся... :)



Отправлено: 05.04.2002, 11:20
Отправитель: Dron (регистрация: 28/12/2001, ответов на счету: 319)
Информзащита
Адрес: Москва
URL: http://asmdev.narod.ru/asmos.html - Операционная система с нуля!
2144510
Россия, Москва

_______________

Отвечает Beeblebrox
Добрый день, Слава!
Там очень много страниц текста, не хочу засорять рассылку. Найди сам Interrupt List by Ralf Brown


Отправлено: 05.04.2002, 13:19
Отправитель: Beeblebrox (регистрация: 13/03/2002, ответов на счету: 61)
URL: http://beeblbrx.narod.ru - Beeblebrox / TMA HomePage
ICQ #75393045
Ukraine, Kharkov

_______________

Отвечает masquer
Добрый день, Слава!
Найди IntList by Ralf Brown. Там все есть. Ссылку я уже давал, сейчас искать лень, через гугл ищется элементарно.


Отправлено: 05.04.2002, 14:08
Отправитель: masquer (регистрация: 16/01/2002, ответов на счету: 86)
Украина, Николаев

_______________

Отвечает Frank
Здравствуйте, Слава!
AH=E3h int 21h
Ой куча целая...
1) OS/286 OS/386 ISSUE REAL INTERRUPT
2) Double DOS Add Character To keyboard buffer of current job
3)... Novell NetWare

AH=4 int 60h
1) FTP Packet Driver - Send Packet
2) MDEBUG - Pop UP
3) SYS_PROF.exe Clean Profiling Table

А теперь вопрос к тебе где ты такое встретил?


Отправлено: 07.04.2002, 09:00
Отправитель: Frank (регистрация: 14/01/2002, ответов на счету: 156)
КПИ,ФЭЛ,ДА-02
ICQ: 100341415 E-mail: Frank_U@mail.ru
Украина, Киев




Форма отправки сообщения
(действительна до момента выхода следующего выпуска рассылки)

Заполните приведенную ниже форму для того, чтобы отправить вопрос. Дополнительную информации по пользованию формой для подписчиков и экспертов можно получить, нажав на знак вопроса в соответствующем разделе, при этом информация будет отображена в отдельном окне.

В почтовых программах форма не работает!!! Открывайте рассылку в браузере Internet Explorer, где и набирайте Ваш вопрос.



 Персональные данные
Ваше имя:
Пароль (экспертам):
E-mail (подписчикам):
Опубликовать мой e-mail в рассылке


 Текст сообщения

Текст вопроса:

Приложение (если необходимо: программа, выдержка из закона и т.п.):



 Выбор подгруппы

Отправить всем экспертам выбранной подгруппы


SpyLOG be number one SUPERTOP

© 2000 - 2002 Россия, Москва. Авторское право: Калашников О. А.


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное