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

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.

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

Ваше имя:

Ваш e-mail:

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


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

Ваш вопрос:


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


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


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

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

В избранное