Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
RusFAQ.ru: программирование на языке Assembler
Информационный Канал Subscribe.Ru |
RusFAQ.ru: программирование на языке Assembler
Выпуск № 541
от 11.05.2003, 13:40
Администратор: Имя: Калашников О.А. URL: Информационный ресурс ICQ: 68951340 Россия, Москва |
О рассылке: Задано вопросов: 3169 Отправлено ответов: 9284 Активность: 292.9 %
|
Список экспертов, ответы которых опубликованы в данном выпуске |
Beeblebrox Статус: Профессиональный Общий рейтинг: 108.64 URL: Beeblebrox / TMA HomePage [Подробней >>] |
Pin Статус: Доверительный Общий рейтинг: 119.23 [Подробней >>] |
Broken Sword Статус: Профессиональный Общий рейтинг: 123.05 URL: моя рассылка по Protected Mode [Подробней >>] |
Andrew Vext Статус: Опытный Общий рейтинг: 106 [Подробней >>] |
Bob Johnson Статус: Профессиональный Общий рейтинг: 150.47 URL: Программирование [Подробней >>] |
Ayl Статус: Профессиональный Общий рейтинг: 119.05 [Подробней >>] |
Igoryk Статус: Профессиональный Общий рейтинг: 117.67 URL: IgorykSoft [Подробней >>] |
Tigran K. Kalaidjian Статус: Опытный Общий рейтинг: 115.81 URL: Методы оптимизации работы ПК [Подробней >>] |
Lynx Статус: Доверительный Общий рейтинг: 140.98 [Подробней >>] |
masquer Статус: Профессиональный Общий рейтинг: 139.77 [Подробней >>] |
VicSimon Статус: Доверительный Общий рейтинг: 102.44 [Подробней >>] |
ASMодей Статус: Профессиональный Общий рейтинг: 115.38 [Подробней >>] |
Maverick Статус: Профессиональный Общий рейтинг: 134 URL: Задачи по ассемблеру Телефон: 89039415024 (BeeLine GSM) [Подробней >>] |
Краткий перечень вопросов |
Вопрос № 3137. Здравствуйте, уважаемые эксперты. Пишу файловую dos-оболочку и столкнулся с проблемой хранения имен ... (ответов: 7)
Вопрос № 3138. Здравствуйте, уважаемые эксперты! Я только учусь программингу на Ассемблере и хотел бы узнать, где м... (ответов: 4)
Вопрос № 3139. Здравствуйте все. Объясните плиз зачем в таком куске используется jbe push esi mov esi, [esp+10] ... (ответов: 5)
Вопрос № 3140. Всем здравия желаю вопрос по загрузке системы Подскажите где я дурак: Цитата: При включении компь... (ответов: 4)
Вопрос № 3141. Здравствуйте, эксперты! В MSDN вычитал, как можно обратится к любому сектору диска (Win98), но для э... (ответов: 1)
Вопрос № 3142. Здравствуйте эксперты! Вопрос не совсем по теме. Где можно найти в интернете алгоритм а лучше пример... (ответов: 1)
Вопрос № 3143. Кто-нибудь слышал о писателе Гинсбурге или Гинсберге(не знаю как правильно), вроде писал фантастику ... (ответов: 1)
Вопрос № 3144. Здравствуйте, уважаемые Эксперты. Я пишу резидентную программу (ОС DOS) в которой необходимо исполь... (ответов: 2)
Вопросов: 8, ответов: 25
Вопрос № 3137 |
Здравствуйте, уважаемые эксперты. Пишу файловую dos-оболочку и столкнулся с проблемой хранения имен файлов. Я их собираюсь хранить в переменной. Моя оболочка будет видеть максимум 2000 файлов, как и NC и VC. Но длина файла вместе с расширением равна 12 байт, а их 2000
(12*2000=24000 байт, что не так то и мало и резервировать под переменную такое количество памяти, которое редко будет использоваться, не очень хорошо). Если не ошибаюсь, то в com-файлах стек хранится в конце сегмента? И если эту огромную переменную объявить в конце файла как db, и потом она разрастется, может ли это что-либо затереть? Заранее благодарен.
Вопрос отправлен: 06.05.2003, 08:12
Отправитель: a1 (a111_666@mail.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Beeblebrox
Приветствую Вас, a1!
Во-первых, не 12, а 11 (точку хранить не нужно).
Во-вторых, стек можно задать совсем в отдельном сегменте даже в COM файле:
mov ax,ds
add ah,10h
cli
mov ss,ax
sti
В-третьих, если размер переменных фиксированный, то ничего затереться не может в принципе:
filenames db 2000 dup(8 dup(?),3 dup(?))
Так что дерзай :)
Ответ отправлен: 06.05.2003, 09:57
Отправитель: Beeblebrox
Отвечает Pin
Приветствую Вас, a1!
Конечно может. Может также затереть все еще быстрей, если сегмент меньше 64К, что может быть когда памяти маловато.
Попробуй использовать динамическую память.
Ответ отправлен: 06.05.2003, 09:43
Отправитель: Pin
Отвечает Broken Sword
Приветствую Вас, a1!
зачем вообще хранить где-то имена файлов? они и так хранятся на диске, ну и что что будет медленнее открываться директория - зато будут все файлы
Ответ отправлен: 06.05.2003, 15:50
Отправитель: Broken Sword
Отвечает Andrew Vext
Доброе время суток, a1!
Почему бы вам не выделять память динамически при чтении каталога?
Ответ отправлен: 06.05.2003, 14:32
Отправитель: Andrew Vext
Отвечает Bob Johnson
Доброе время суток, a1!
Может. Но кто тебе мешает использовать место после своей программы? Ведь после запуска вся память выделяется твоей программе и ты можешь делать с ней все, что хочешь.
Только когда ты захочешь запустить из своей оболочки другую программу, тогда придется эту память отдать.
Еще можешь сразу ее отдать, оставив только небольшой кусок себе для программы инициализации, а когда оболочка запускается сразу себе ее выделять (только выделяй не 24000, а столько, сколько надо вообще, не только для хранения имен файлов).
Ответ отправлен: 06.05.2003, 22:16
Отправитель: Bob Johnson
Отвечает Ayl
Доброе время суток, a1!
Во-первых, ты можешь использовать неиспользуемое место в кодовом сегменте, при условии, что у тебя стек не будет слишком большим. В кодовом сегменте у тебя свободного места остается 64К - 256 (PSP) - размер программы - суммарный размер статических переменных (определяемых либо в сегменте кода, либо в сегменте данных) - размер используемого стека.
Скорее всего, на размер около 25К ты вполне можешь рассчитывать.
Во-вторых, так как вся память в твоем полном распоряжении, ты можешь предполагать, что следующий сегмент за твоей программой свободен. Т.е. устанавливаешь сегментный регистр (например, es) на адрес cs+1000h и используешь этот семент под хранение имен файлов.
В-третьих, после запуска программы ты можешь освободить память по размеру программы и потом выделить нужный тебе кусок отдельно.
В-четвертых, ты просто можешь сразу же "откусить" нужный тебе кусок памяти в момент компиляции:
file_list db 2000 dup (8 dup (?), 3 dup (?))
Ответ отправлен: 06.05.2003, 12:12
Отправитель: Ayl
Отвечает Igoryk
Здравствуйте, a1!
Нет это разрастание ничего не затрет, только если не превысит порог 0FFFEh, потому, что потом в COM файлах идет адрес 0000h, а не 10000h!
Ответ отправлен: 07.05.2003, 18:31
Отправитель: Igoryk
Вопрос № 3138 |
Здравствуйте, уважаемые эксперты! Я только учусь программингу на Ассемблере и хотел бы узнать, где можно найти список всех прерываний и функций BIOS (если есть, на русском). Спасибо за ответ заранее!
Вопрос отправлен: 06.05.2003, 12:28
Отправитель: Gremlin (gremlin@nnovgorod.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Bob Johnson
Доброе время суток, Gremlin!
Ralf Braun Interrupt List.
Ответ отправлен: 07.05.2003, 13:27
Отправитель: Bob Johnson
Отвечает Tigran K. Kalaidjian
Добрый день, Gremlin!
Список прерываний Ральфа Брауна:
http://www-2.cs.cmu.edu/~ralf/files.html
Приложение:
Ответ отправлен: 06.05.2003, 15:06
Отправитель: Tigran K. Kalaidjian
Отвечает Lynx
Здравствуйте, Gremlin!
Выслал. Лови.
Ответ отправлен: 07.05.2003, 13:57
Отправитель: Lynx
Отвечает Pin
Здравствуйте, Gremlin!
Если мне нужна подобная инфо, то я первым делом лезу в Яндекс.
А ввобще посмотри следующие ресурсы.
www.codenet.ru
www.wasm.ru
Ответ отправлен: 08.05.2003, 17:25
Отправитель: Pin
Вопрос № 3139 |
Здравствуйте все.
Объясните плиз зачем в таком куске используется jbe
push esi
mov esi, [esp+10]
test esi, esi
jbe xxxxxxxx
Вроде "test 1reg, 1reg" это проверка на ноль, тогда нафига jbe, т.е. почему
не jz или jnz? Что даёт использование jbe?
И ещё, есть ли у кого-нибудь такое сочетание - халявный инет+IDA Pro(не демо)?
Если есть, то буду очень благодарен за последнее.
Спасибо.
Вопрос отправлен: 06.05.2003, 20:46
Отправитель: Макс (maxe@mail.kz)
[Следующий вопрос >>] [Список вопросов]
Отвечает Broken Sword
Приветствую Вас, Макс!
test трогает не только ZF, а еще и SF (флаг знака) и PF (флаг четности), поэтому тут все правильно - jbe означает "прыг если отрицательное или 0"
IDA про 4.3 не демо есть, халявный инет - это утопия.
линк есть у Masquer-а.
Ответ отправлен: 06.05.2003, 21:40
Отправитель: Broken Sword
Отвечает Bob Johnson
Здравствуйте, Макс!
Ну вот так захотелось программисту. Может чтобы запутать начинающих, т.к. test сбрасывает флаг C, а если C = 0, то jbe - то же самое, что и jz.
Ответ отправлен: 07.05.2003, 13:28
Отправитель: Bob Johnson
Отвечает Tigran K. Kalaidjian
Доброе время суток, Макс!
Команда Условие Флаги
JZ Jump если ноль: ZF=1
JBE Jump if меньше/равно: CF=1 или ZF=1
В обоих случаях идет проверка флага ZF, так что без разницы... Просто кому-то JBE больше нравится...
Ответ отправлен: 07.05.2003, 15:25
Отправитель: Tigran K. Kalaidjian
Отвечает masquer
Приветствую Вас, Макс!
в гугле ищи ключевое слово Ida430a.rar. jbe зависит от zf и cf. Но так как test esi, esi на cf никак не влияет (cf=0), так что скорее всего - это глюк компилятора.
Ответ отправлен: 07.05.2003, 12:08
Отправитель: masquer
Отвечает Ayl
Здравствуйте, Макс!
Позволю несогласиться с Broken Sword. Если бы в качестве команды перехода стояла бы команда JLE, то он бы был прав. Но JBE - это переход после беззнакового сравнения. И флаг SF при этом не участвует. Поэтому данный переход будет осуществляться только при значении регистра ESI равном 0. Т.е. действительно можно было бы заменить JBE на JZ.
А насчет команды TEST Broken Sword прав - это не только проверка на 0, но и заодно проверка на знак числа. Естесственно, при использовании соответсвующих проверок флагов в дальнейшем.
Ответ отправлен: 07.05.2003, 11:05
Отправитель: Ayl
Вопрос № 3140 |
Всем здравия желаю
вопрос по загрузке системы
Подскажите где я дурак:
Цитата:
При включении компьютера регистр CS устанавливается в FFFFh а IP в 0. Поэтому первая инструкция, подлежащая выполнению, начинается с адреса FFFF:0000 - с точки начала BIOS.
___________________________________________
смотрим дальше:
Цитата (переработанная:)):
Карта памяти:
с 0000:0000 по B000:FFFF - ОЗУ (768К)
с С000:0000 по F000:FFFF - ПЗУ (256К)
___________________________________________
первой инструкцией если посмотреть в отладчике будет INT 19h, т.е. 25-ое прерывание. Адреса обработчиков прерываний находятся в области памяти типа ОЗУ по адресам 0000:0000-0000:03ff.
Получается, что указатели обработчиков прерываний, находящиеся в энергозависимой памяти, находятся там, еще до старта инициализирующей программы?????? Как это возможно???? Может это конечно та самая CMOS память, ну а если батарейку вытащить, что тогда???? Да еще - указатель 25-го прерываний указывает на область памяти ОЗУ (то бишь сам указатель находится по адресу 0000:0064, а его значение - 06e4:002f), бред какой-то:(
Помогите мысли в порядок привести, пожалуйста, а то мир рушится!!!
P.S.: Еще просьба - если у кого есть инфа по процессу загрузки системы (с адресацией), реинженерингу , если не жалко поделитесь пожалуйста, простите за наглость
Вопрос отправлен: 06.05.2003, 23:28
Отправитель: druid (druid_@rambler.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает VicSimon
Доброе время суток, druid!
Не правильно! Первая инструкция находится по адресу FFFF:0000 или F000:FFF0. Сколько я видел исходников BIOS, во всех по этому адресу находится far jmp на начало процедуры инициализации в ПЗУ (где-то в сегменте F000, зависит от реализации, версии etc).
Для исследования содержимого BIOS рекомендую дизассемблер sourcer - позволяет делать листинг BIOS'ов матер. платы и видеокарты с подробными комментариями.
Ответ отправлен: 07.05.2003, 05:15
Отправитель: VicSimon
Отвечает ASMодей
Доброе время суток, druid!
Да, известный прикол винды. в свое время я сам на него
попался. Она просто заменяет BIOS для запускаемых
приложений. Если посмотреть под чистым DOS, то никаких
INTов ты там не увидишь.
Ответ отправлен: 07.05.2003, 14:19
Отправитель: ASMодей
Отвечает Broken Sword
Приветствую Вас, druid!
дурак сидит в цитате. При включении компьютера регистр CS устанавливается в 0xF000, а регистр IP - в 0xFFF0. Кроме того, проц находится в реальном режиме. Поэтому первая выполняемая инструкция находится по адресу: F0000+FFF0=FFFF0h, т.е. на 16 байт ниже 1 Мб. Что интересно: то что ты написал (CS=FFFF IP=0) в результате дают нам тот же самый физический адрес - FFFF0, однако совпадение следует считать чисто случайным.
Далее. Все знают, что начиная с адреса FFFF0 (или FFFF:0000 или F000:FFF0, называй как хочешь, в реальном режиме это все один адрес - FFFF0) чипсет материны отображает ПЗУ, а конкретно по адресу FFFF0 находится инстукция перехода на процедуру выполняющую системный сброс (в отладчике ты чего то не того углядел). А далее POST продолжается
За наглость прощаем )
Ответ отправлен: 07.05.2003, 11:26
Отправитель: Broken Sword
Отвечает Ayl
Добрый день, druid!
Попытаюсь... Ты небось память исследуешь под виндами? Тогда ты исследуешь не ROM-BIOS, а кусок памяти, выделенный твоей задаче. И в нем по адресу FFFF:0 находится именно INT 19h. Скорее всего для обеспечения защиты от перезагрузки. А чтобы посмотреть оригинальное содержимое памяти тебе нужно либо зайти под "голым" DOS'ом, либо написать соответсвующую программку, скажем, для загрузки с дискеты и сохранения области памяти...
Ответ отправлен: 07.05.2003, 11:28
Отправитель: Ayl
Вопрос № 3141 |
Здравствуйте, эксперты!
В MSDN вычитал, как можно обратится к любому сектору диска (Win98), но для этого код примера должен находится в 16разрядной DLL. Как создать 16разр. DLL(желательно на VC++)?
Вопрос отправлен: 07.05.2003, 09:32
Отправитель: EraSer (eraser99@tut.by)
[Следующий вопрос >>] [Список вопросов]
Отвечает masquer
Доброе время суток, EraSer!
Найти компилятор соответствующий, а лучше версию VC (1.x). Хотя, имхо, проще vxd написать
Ответ отправлен: 08.05.2003, 11:14
Отправитель: masquer
Вопрос № 3142 |
Здравствуйте эксперты!
Вопрос не совсем по теме.
Где можно найти в интернете алгоритм а лучше пример
бочкообразной дисторсии(геометрическая аберрация Зайделя).
Вопрос отправлен: 07.05.2003, 10:26
Отправитель: Игорь
[Следующий вопрос >>] [Список вопросов]
Отвечает Ayl
Добрый день, Игорь!
Ну не знаю, даст ли тебе кто прямые ссылки, но обычно это делается так. Заходишь на поисковый сайт (типа www.ya.ru, www.ru, www.rambler.ru, www.aport.ru - это все русские, можно поиск по-русски задавать; или www.yahoo.com, www.google.com (есть и русский - www.google.ru), www.altavista.com - западные) и вводишь запрос на поиск, типа "геометрическая аберрация Зайделя". Тебе будет предложен список сайтов, где есть подобные слова. Дальше выбираешь то, что тебе нужно.
Кстати, yandex нашел примерно 1589 страниц на не менее чем 660 серверах. Думаю, что в первом же десятке ты найдешь то, что хочешь.
Ответ отправлен: 07.05.2003, 11:46
Отправитель: Ayl
Вопрос № 3143 |
Кто-нибудь слышал о писателе Гинсбурге или Гинсберге(не знаю
как правильно), вроде писал фантастику или киберпанк!Если есть скажите. Заранее благодарен!!!
Вопрос отправлен: 07.05.2003, 13:17
Отправитель: rams (rams@belovo.net.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Maverick
Здравствуйте, rams!
Такого не слышал, может Гибсона?
Ответ отправлен: 08.05.2003, 06:27
Отправитель: Maverick
Вопрос № 3144 |
Здравствуйте, уважаемые Эксперты.
Я пишу резидентную программу (ОС DOS) в которой необходимо использовать функции DOS-а (int21h).
Так как эти функции нельзя вызывать повторно я использую 28h прерывание.
Проблема заключается в следующем: в "голом" DOS-е все работает нормально, но если запущен Norton Commander, то возникает ощущение, что 28h вообще не вызывается...
В чем проблема?
Заранее спасибо.
Вопрос отправлен: 07.05.2003, 13:34
Отправитель: Vadim
[Следующий вопрос >>] [Список вопросов]
Отвечает Bob Johnson
Доброе время суток, Vadim!
Вполне возможно. Дос сам вызывает это прерывание, когда ему нечего делать. Если же запущено приложение и управление передано ему (приложению), то это уже его задача вызывать это пр. когда пользователь ничего не делает.
Попробуй использовать флаг indos - если он будет работать, то тогда можешь организовать вызов int 21h с его проверкой.
Ответ отправлен: 07.05.2003, 22:30
Отправитель: Bob Johnson
Отвечает Ayl
Здравствуйте, Vadim!
28-е прерывание это, конечно, хорошая штука, но как говорится в описании к нему, не гарантируется, что оно будет отрабатывать достаточно часто. Все дело в том, что это прерывание генерируется в момент ожидания ввода с помощью функций DOS с номерами от 1 до 0Ch. В результате, если пользовательская программа не использует эти сервисы (например, получает ввод с помощью прерывания BIOS 16h), то 28-е прерывание срабатывать не будет. Не могу сказать, какой механизм ввода используется в Norton Commander, но судя из твоего описания проблемы он организует ввод не через функции DOS'а.
Способ избежать бесконечно долгого ожидания возможности активации резидента - использовать прерывание от таймера (8 или 1Ch) и флаг занятости DOS'а (InDOS, адрес флага - содержимое регистров ES:BX после вызова функции 34h прерывания 21h). Если InDOS <> 0, то "всплывать" нельзя, если InDOS = 0, то можно вызывать любые прерывания DOS.
Кроме этого, реализация 21-го прерывания позволяет выполнять функции от 1 до 0Ch, если выполняется одна из функций старше 0Ch и наоборот. Так что можешь перехватить и 21-е прерывание и устанавливать свои флаги на предмет определения, в какой диапазон попадает вызванная функция. Если то, что ты хочешь выполнить, принадлежит другому диапазону - смело можешь активироваться.
Ответ отправлен: 07.05.2003, 14:33
Отправитель: Ayl
Форма отправки вопроса |
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.
(C) 2002-2003 Команда RusFAQ.ru.
Вопрос и дополнение |
Ваш вопрос:
Приложение (если необходимо):
Получить ответов:
Выбор рассылки |
Программисту Assembler (36) C / C++ (28) Perl (5) Delphi (14) Pascal (28) Basic / VBA (12) Java / JavaScript (10) PHP (6) MySQL / MSSQL (4) |
Пользователю Windows 95/98/Me (37) Windows NT/2000/XP (29) "Железо" (27) Поиск информации (12) |
Администратору Windows NT/2000/XP (17) Linux / Unix (9) |
Юристу Гражданское право (8) Семейное право (4) Трудовое право (5) КоАП (4) |
Отправить вопрос всем экспертам выбранной рассылки.
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
© 2003 Россия, Москва. Авторское право: RusFAQ.ru |
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||