Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
RusFAQ.ru: программирование на языке Assembler
Информационный Канал Subscribe.Ru |
RusFAQ.ru: программирование на языке Assembler
Выпуск № 401
от 27.10.2002, 12:30
Администратор: Имя: Калашников О.А. URL: Информационный ресурс ICQ: 68951340 Россия, Москва |
О рассылке: Задано вопросов: 1616 Отправлено ответов: 5081 Активность: 314.4 %
|
Список экспертов, ответы которых опубликованы в данном выпуске |
Артём Шегеда Статус: Профессиональный Общий рейтинг: 116.57 URL: Пристанище неодинокого программиста [Подробней >>] |
Broken Sword Статус: Профессиональный Общий рейтинг: 131.58 URL: моя рассылка по Protected Mode [Подробней >>] |
masquer Статус: Профессиональный Общий рейтинг: 154.84 [Подробней >>] |
oleg Статус: Доверительный Общий рейтинг: 136.84 [Подробней >>] |
LIFO Статус: Опытный Общий рейтинг: 129.19 Телефон: 8 01710 24758 [Подробней >>] |
Bob Johnson Статус: Профессиональный Общий рейтинг: 153.65 [Подробней >>] |
Eugene Статус: Доверительный Общий рейтинг: 117.09 [Подробней >>] |
Portnov Статус: Профессиональный Общий рейтинг: 118.91 URL: Мой сайтик... [Подробней >>] |
Gibbel Статус: Профессиональный Общий рейтинг: 108.56 URL: Страничка обо мне и моих друзьях [Подробней >>] |
St Статус: Доверительный Общий рейтинг: 113.96 [Подробней >>] |
Dark_Lord Статус: Профессиональный Общий рейтинг: 130 [Подробней >>] |
Ayl Статус: Профессиональный Общий рейтинг: 117.97 [Подробней >>] |
Biv Статус: Опытный Общий рейтинг: 116.38 [Подробней >>] |
Maverick Статус: Опытный Общий рейтинг: 138.66 URL: Страница по асму и вирмейку Телефон: 89039415024 (BiLine GSM) [Подробней >>] |
Supra Статус: Доверительный Общий рейтинг: 119.19 [Подробней >>] |
Dmitry Статус: Начальный Общий рейтинг: 103.33 [Подробней >>] |
VicSimon Статус: Доверительный Общий рейтинг: 103.53 [Подробней >>] |
Sensey Статус: Профессиональный Общий рейтинг: 124.48 URL: Страничка рассылки по Паскаля... Телефон: +38 (0572) 41-76-04 дом. [Подробней >>] |
Краткий перечень вопросов |
Вопрос № 1577. Здравствуйте, дорогие эксперты.Довольно долго читаю рассылку и решил обратиться к ВАМ со следующим в... (ответов: 5)
Вопрос № 1578. Здраствуйте многоуважаемые! У меня к вам несколько вопросов: 1: Как работать с WindowsHook 2: Когда ... (ответов: 2)
Вопрос № 1579. Здравствуйте Как отладчик CodeView сохраняет файл? У него в меню записано Open Source и какое-то Ope... (ответов: 3)
Вопрос № 1580. Уважаемые ЭКСПЕРТЫ, 1) подскажите пожайлуста есть ли какая то альтернатива функции FindWindowEx в Wi... (ответов: 7)
Вопрос № 1581. всем привет! Спасибо эксперты, за ответы на мой вопрос №1494, теперь вот в другом загвостка. Тот же ... (ответов: 4)
Вопрос № 1582. Добрый день! Не подскажите как использовать ф-цию "RegisterServeiceProcess". В MSDN(07/199... (ответов: 3)
Вопрос № 1583. Здравствуйте Товарищи! Вот у меня такой вопрос - нужно в видео пямять что-нибудь положить. Скажем во... (ответов: 7)
Вопрос № 1584. Здравствуйте. У меня возник вопрос по поводу видео? Cегмент видеобуфера ,начинается с адреса 0B800:0... (ответов: 9)
Вопрос № 1585. Можно ли отформатировать только часть жесткого диска(на низком уровне), как это сделать через порты ... (ответов: 2)
Вопрос № 1586. Здравствуйте. Растолкуйте мне пожалуйста следующее. Я в с помощью отладчика CodeView правлю com-файл... (ответов: 5)
Вопрос № 1587. Доброе время суток, уважаемые эксперты! У меня такой вопрос: а)Как лучше работать с Com1 - через BIO... (ответов: 6)
Вопрос № 1588. Доброго времени суток, уважаемые Эксперты! У меня имеется пара вопросиков. Короче, сначала опишу сит... (ответов: 2)
Вопрос № 1589. Не могу понять, в чем дело - пишу небольшую прогу под DPMI. Компилируется и работает в DOS-сессии Wi... (ответов: 1)
Вопросов: 13, ответов: 56
Вопрос № 1577 |
Здравствуйте, дорогие эксперты.Довольно долго читаю рассылку и решил обратиться к ВАМ со следующим вопросом. Я разрабатываю программу на ассемблере для микропроцессорной системы (МПС), базирующейся на Intel 80186 процессоре. Для программирования используется TASM. Часть кода, которая не особенно привязана к аппаратной части МПС отлаживаю прямо на PC, используя TURBO DEBUGGER. Возникла следующая проблема - после непродолжительной работи МПС (около восьми минут) в сегменте данных появляется мусор. Я подозреваю, что где-то один из указателей выходит за рамки,отведенные для его структуры данных. Поэтому хотелось бы запустить на программу исполнение и отследить все записи в те ячейки памяти, где у меня хранятся указатели. Хорошо бы получить файл, в котором бы имелась следующая информация: номер строки исходного кода, в котором осуществлялось обращение к ячейке и значение, занесенное в неё. С помощью какого дебаггера или трассера можно это сделать? Я просмотрел возможности около десяти различны дебаггеров и так не придумал, как это можно сделать. Заранее благодарен, Андрей.
Вопрос отправлен: 22.10.2002, 15:11
Отправитель: Andriy Bench (abench@postmark.net)
[Следующий вопрос >>] [Список вопросов]
Отвечает Артём Шегеда
Приветствую Вас, Andriy Bench!
Вообще-то это задача для процессора 80386 и выше, поскольку только он позволяет аппаратно отслеживать обращения к определённому диапазону адресов.
Для отлова глюка рекомендую TurboDebugger 5.0. Он поддерживает аппаратные точки останова. Просто указываешь адрес ячейки, которую хочешь проконтролировать на запись, и ждёшь, как хищник - жертву.
Второй метод - программная эмуляция. Но это очень медленно (раз в 20-100).
Ответ отправлен: 22.10.2002, 18:30
Отправитель: Артём Шегеда
Отвечает Broken Sword
Добрый день, Andriy Bench!
В идеале - возьми это чудо на комп, где пойдет softICE, там тебе как раз BPM (или еще круче - BPR, если найдешь 9x мастдай) с параметром BPLOG и придутся по душе...
Если все так плохо - используй отладчик TR 2.52, ИМО - самый ЛУЧШИЙ из отладчиков в реальном режиме...
(качать с www.exetools.com)
Ответ отправлен: 22.10.2002, 17:11
Отправитель: Broken Sword
Отвечает masquer
Добрый день, Andriy Bench!
Да любой нормальный отладчик такое должен делать. Я для этого либо SoftIce, либо OllyDbg пользую, но это все для виндов.
Ответ отправлен: 23.10.2002, 10:55
Отправитель: masquer
Отвечает oleg
Приветствую Вас, Andriy Ben
для этого подойтет дебаг afd v 1.31
Ответ отправлен: 22.10.2002, 15:25
Отправитель: oleg
Отвечает LIFO
Здравствуйте, Andriy Bench!
А такое теоретически возможно?
Наверное ручками придется.
И попробуй дизассемблить прогу, может что-нибудь увидишь.
Ответ отправлен: 22.10.2002, 16:36
Отправитель: LIFO
Вопрос № 1578 |
Здраствуйте многоуважаемые!
У меня к вам несколько вопросов:
1: Как работать с WindowsHook
2: Когда я загружаю меню из ресурса
invoke LoadMenu, hInstance, addr MenuName
mov hMenu, eax
А потом при нажатии на иконку в трее отображаю его
invoke GetCursorPos,addr pt
invoke TrackPopupMenu,hMenu,TPM_RIGHTALIGN,pt.x,pt.y,NULL,hWnd,NULL
У меня получается страшная вешь меню в виде тонкой полоски (в ширину)
3: Мне надо на Masm32 написать процедуру...
В Delphi она выглядит так:
procedure SetText(mode: integer);
begin
case mode of
10: MessegeBox(0, 'Hello, word!!!', 'Message', MB_OK);
20: MessegeBox(0, 'Goodbye, word!!!', 'Message', MB_OK);
end;
В Си вот так:
void SetText(int mode)
{
switch(mode)
{
10: MessageBox(NULL, "Hello, word!!!", "Message", MB_OK);
20: MessegeBox(NULL, "Goodbye, word!!!", "Message", MB_OK);
}
}
Если использовать оператор if то это замедляет
скорость выполнения программы.
Заранее блогадарен.
Вопрос отправлен: 22.10.2002, 15:34
Отправитель: Kron (kron@sigmanet.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает masquer
Добрый день, Kron!
1. Что значит как.
Вот это должно быть в библиотеке
invoke SetWindowsHookEx,WH_KEYBOARD,addr KeyProc,hInstance,0
В двух словах все равно не расскажу, а подводных камней тут предостаточно, пробуй, если что спрашивай.
3. Можешь через Lookup table прыжок делать, правда, тоже не самый быстрый вариант. А зачем тебе здесь скорость?
Ответ отправлен: 23.10.2002, 11:07
Отправитель: masquer
Отвечает Bob Johnson
Здравствуйте, Kron!
1. Устанавливаешь его функцией SetWindowsHookEx. Если хочешь, чтобы он распространялся на всю систему - ты должен поместить его в DLL. Устанавливать можно оттуда же (но только один раз!).
2. Все правильно. Чтобы получить popup меню, тебе надо в качестве хэндла указать не основное меню, а любое его подменю! Например: TrackPopupMenu (GetSubMenu (menu, 0), TPM_RIGHTBUTTON, p.x, p.y, 0, hWnd, 0);
3. Нужно писать cmp [param], 10; jz @@metka и т.д.
Ответ отправлен: 24.10.2002, 12:50
Отправитель: Bob Johnson
Вопрос № 1579 |
Здравствуйте
Как отладчик CodeView сохраняет файл? У него в меню записано Open Source и какое-то Open Module и ногде никакого Save.
Спасибо.
Почему если я снимаю отметку "Опубликовать мой e-mail в рассылке" мой e-mail все равно попадает в рассылку?
Спасибо.
Вопрос отправлен: 22.10.2002, 16:03
Отправитель: Bayram Annanurov
[Следующий вопрос >>] [Список вопросов]
Отвечает Broken Sword
Здравствуйте, Bayram Annanurov!
интересно, зачем в отладчике сохранять файл? это ж не дизассемблер какой нибудь...
Ответ отправлен: 22.10.2002, 17:11
Отправитель: Broken Sword
Отвечает Eugene
Доброе время суток, Bayram Annanurov!
В дебуггерах вроде как ни в одном нету такой фичи.
P.S. А ко мне твоё мыло не попало. Могу предположить, что ты ошибаешься.
Ответ отправлен: 22.10.2002, 17:46
Отправитель: Eugene
Отвечает Portnov
Приветствую Вас, Bayram Annanurov!
А никак он не сохраняет... А зачем отладчику сохранять файл? Он ведь его не изменяет, а только отлаживает... Это дизассемблеры обычно полученный исходник или листинг сохраняют. Если вам такое надо, берите IDA или хотя бы Sourcer... Но лучше, конечно, IDА.
С уважением, Portnov.
Ответ отправлен: 23.10.2002, 13:27
Отправитель: Portnov
Вопрос № 1580 |
Уважаемые ЭКСПЕРТЫ,
1) подскажите пожайлуста есть ли какая то альтернатива функции FindWindowEx в WinNT. (тк FindWindowEx не поддерживается WinNT)
2) при программировании под Дос movsb(w) переносило данные с DS:SI в ES:DI. А при 32битном программирование под Виндос откуда что переносится (как я понимаю указатели на сегменты там уже не нужны..)
Вопрос отправлен: 22.10.2002, 16:34
Отправитель: Dadavas (dadavas@yandex.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Gibbel
Доброе время суток, Dadavas!
1. С чего ты взял, что в WinNT она не работает???
Информация из MSDN:
HWND FindWindowEx(
HWND hwndParent, // handle to parent window
HWND hwndChildAfter, // handle to child window
LPCTSTR lpszClass, // class name
LPCTSTR lpszWindow // window name
);
Requirements
Windows NT/2000 or later: Requires Windows NT 4.0 or later.
Windows 95/98/Me: Requires Windows 95 or later.
Header: Declared in Winuser.h; include Windows.h.
Library: Use User32.lib.
Unicode: Implemented as Unicode and ANSI versions on Windows NT/2000.
2. Все так же, как и под ДОС (процессор то один и тот же ;-)), только DS:ESI и ES:EDI соответственно.
Ответ отправлен: 22.10.2002, 17:13
Отправитель: Gibbel
Отвечает Broken Sword
Приветствую Вас, Dadavas!
2. Переносятся данные из сегмента, который описывается дескриптором, селектор которого лежит в DS в сегмент, который описывается дескриптором, селектор которого лежит в ES. Так что все в принципе остается на своих местахъ, только преобразование логического адреса в линейный происходит по другому
Ответ отправлен: 22.10.2002, 17:15
Отправитель: Broken Sword
Отвечает Portnov
Доброе время суток, Dadavas!
2) Переностся из DS:ESI в ES:EDI. Сегменты под виндой остаются, никуда не деваются. Другое дело, что при написании прикладных программ на асме их заметить невозможно, для прикладного программиста их нет. А на уровне архитектуры проца они никуда не деваются. При запуске win-программы, если не ошибаюсь, ES устанавливается равным DS (а может, нет...), а DS указывает (грубо говоря, т.к. там все сложнее) на начало ваших данных. Так что, AFAIK, можно под Виндой безбоязненно писать
.code
mov cx,100; Ну, конечно, в разумное значение установить...
mov esi,offset str1
mov edi,offset str2
rep movsb
...
.data
str1 db 'dgdrgesrty...'
str2 db 'wsrfertewt...'
С уважением, Portnov.
Ответ отправлен: 23.10.2002, 13:36
Отправитель: Portnov
Отвечает masquer
Доброе время суток, Dadavas!
1. Все там нормально работает - у себя ищи баги.
2. Ты ж написал 32-битном. Соответственно и регистры должны быть 32-битными esi и edi соответственно.
Ответ отправлен: 23.10.2002, 11:13
Отправитель: masquer
Отвечает St
Привет, Dadavas!
1) А FindWindow не подходит?
2) Да. Не нужны. Просто указываете ESI и EDI.
St
Ответ отправлен: 22.10.2002, 19:55
Отправитель: St
Отвечает Dark_Lord
Добрый день, Dadavas!
1) На счёт WinNT не знаю
2) в Windows movsb(d) переносит байт(двойное слово) из esi в edi!
Ответ отправлен: 22.10.2002, 20:36
Отправитель: Dark_Lord
Отвечает Bob Johnson
Доброе время суток, Dadavas!
У тебя, наверное, NT 3.51. Можешь поставить себе 4.0. В противном случае - вызывай FindWindow. Или еще можно рекурсивно проходить все окна, начиная от десктопа - функцией GetWindow.
2. Точно так же - из DS:[esi] в ES:[edi], только под виндой ds=es=один большой сегмент данных. Так что не задумывайся о значениях в ds и es - они (если ты сам не менял) правильные.
Ответ отправлен: 24.10.2002, 12:51
Отправитель: Bob Johnson
Вопрос № 1581 |
всем привет!
Спасибо эксперты, за ответы на мой вопрос №1494, теперь вот в другом загвостка. Тот же Lines. Делаю цикл, в нем:
1.вычисляю левую клетку относительно стартовой
2.правую
3.верхнюю
4.нижнюю
5.просматриваю все их поочереди
6.если пустая, то надо как-то адрес сохранить
7.идти снова вначало цикла
Так вот, если я в цикле буду push'ить, то эти адреса лягут сверху старых, и цикл, соот-но будет не старые дорассматривать, а начнет новые. Как-бы сделать так, чтобы сохранять в стеке новые адреса, но пока не кончатся старые, к новым не переходить. Может можно как-то по-другому.
Вопрос отправлен: 22.10.2002, 17:41
Отправитель: -=TT=- (KunaevNA@PosolskyDom.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает oleg
Доброе время суток, -=TT=-!
А не проще ли будет организовать строковый массив данных
tab db?
mas dw ?
.
.
.
.
mov offset mas[tab+si],{nom клетки}
Ответ отправлен: 22.10.2002, 18:07
Отправитель: oleg
Отвечает Ayl
Добрый день, -=TT=-!
Ну так ведь сказано же было, что должна быть очередь, а не стек. Хотя и со стеком можно...
А как организовать очередь... Ну, чтобы не завязываться с указателями, сделай как в буфере клавиатуры - есть область памяти допустим, 100 единиц (1 единица = размер информации о клетке), и 2 указателя - на начало очереди и ее конец. По указателю на конец очереди записываем новые элементы, а по указателю на начало обрабатываем старые. После каждого действия соответствующий указатель изменяется на 1 единицу в сторону увеличения. Когда какой-либо указатель = 100, то он сбрасывается в 0. Если указатели равны, то очередь пуста, если указатель конца очереди на 1 меньше указателя начала очереди или указатель конца очереди = 99, а указатель начала = 0, то очередь заполнена.
Ответ отправлен: 22.10.2002, 18:15
Отправитель: Ayl
Отвечает Артём Шегеда
Доброе время суток, -=TT=-!
Я метод волны использовал для своей программы разводки печатных плат (эх, как давно это было...)
Организовывал двумерный массив A[M x N], изначально заполненный нулями. x1,y1 - координаты начальной точки, x2,y2 - координаты конечной точки.
1. i:=1
2. A[x1,y1]:=i
3. Просматривал весь массив в поисках A[i,j]==i
4. Для всех соседей, значения которых равно 0:
4а. Выставляю значение A[i+di,j+dj]:=i+1
4б. Если i+di!=x2 или j+dj!=y2, то перейти к п.7
5. Если в течении просмотра массива "волна не продолжена", то алгоритм завершён с признаком "конечная точка не доступна"
6. перейти к п.3
7. "Раскручиваем" цепочку в обратную сторону (для текущей ячейки ищем первого соседа, на 1 меньшого)
В этом алгоритме использование стека (или очереди) координат ячеек не нужно, однако для обработки больших массивов нужно много времени (надеюсь, в твоём Lines не будет полей, размером 1000h x 1000h :)
Этот алгоритм работал на процессоре 580ВМ80А (8бит, 700 оп/сек) с ОЗУ, объёмом 32Кбайта
Ответ отправлен: 22.10.2002, 18:48
Отправитель: Артём Шегеда
Отвечает Bob Johnson
Добрый день, -=TT=-!
Как я понял - тебе нужен не стек, а очередь. В случае очереди новые элементы добавляются в конец, а считываются элементы - из начала. Чтобы эффективно организовать небольшую очередь в памяти, тебе нужно знать ее максимальный размер, тогда ты можешь заранее выделить под нее нужный объем памяти. Организуется она очень просто - два указателя: один на конец, другой на начало. Если они равны - очередь пуста. При добавлении - добавляется элемент и указатель на конец увеличивается. При считывании - считывается и затем увеличивается (указатель на начало).
Ответ отправлен: 24.10.2002, 12:52
Отправитель: Bob Johnson
Вопрос № 1582 |
Добрый день!
Не подскажите как использовать ф-цию "RegisterServeiceProcess". В MSDN(07/1999) про нее ничего нет.
Спасибо!
Вопрос отправлен: 22.10.2002, 18:04
Отправитель: Mixa
[Следующий вопрос >>] [Список вопросов]
Отвечает Артём Шегеда
Приветствую Вас, Mixa!
Это устаревшая функция (в WindowsNT/2000/XP уже не поддерживается), поэтому описание на неё уже не публикуется. Но в Windows95/98/Me она ещё живёт.
Код в примере позволяет "безболезненно" её использовать
Приложение:
Ответ отправлен: 22.10.2002, 18:53
Отправитель: Артём Шегеда
Отвечает Eugene
Добрый день, Mixa!
Используй функцию CreateService.
Ответ отправлен: 23.10.2002, 09:36
Отправитель: Eugene
Отвечает Bob Johnson
Доброе время суток, Mixa!
А вот и не угадал! В MSDN она описана, только ты ее по указателю не найдешь - надо искать поиском (набираешь RegisterServiceProcess) - и все. У нее два параметра: первый - идентификатор процесса, с которым ты хочешь работать (0 - текущий), второй - 0 или 1. 1 - зарегистрировать процесс как системный и 0 - обратно. Системный процесс не отображается по Ctrl-Alt-Del.
Приложение:
Ответ отправлен: 24.10.2002, 12:53
Отправитель: Bob Johnson
Вопрос № 1583 |
Здравствуйте Товарищи!
Вот у меня такой вопрос - нужно в видео пямять что-нибудь положить. Скажем вот в досовском дебагере по с оригинальным именем Debug я пишу вот такую строчку
F B800:0 1000 A1
чтобы записать в видео буфер число A1
а Как мне это сделать на ассеме? Вот мне препод по асму сказал что и сам не знает как =((((((( тока посоветовал адрес представить как 20 битный и мувом писать.
я по всЯКОМУ пробовал... =( так например:
mov [0b8000h], a1 ; в 20 битном виде
mov [0b800h], a1
mov ax, 0
mov [0b800:ax], a1
никак не получается. Даже не компилится... что-то тут не так. Может надо комманду OUT использовать? А может это всё вообщ0н не так просто как в дубаггире? А может надо в сегмент даты сначала записать это смещение а потом уже просто делать сдвиг?
Расскажите мне плиз.
Вопрос отправлен: 22.10.2002, 21:42
Отправитель: Самохвалов Эдвард (zeleniy_kot@yahoo.com)
[Следующий вопрос >>] [Список вопросов]
Отвечает Ayl
Добрый день, Самохвалов Эдвард!
Мда... Это где ж такие преподы водятся? :-( Куда катится наше образование? :-( Ну да ладно...
Видеобуфер в текстовом режиме начинается по адресу 0b800h:0 и занимает либо 2000 байт (для режима 40*25), либо 4000 байт (для режима 80*25).
Каждый символ занимает 2 байта в видеобуфере: 1-й байт собственно сам символ, 2-й - его атрибут, т.е. цвета текста и фона для данного символа.
Например, атрибут 1fh будет отображать белые символы (f) на синем фоне (1).
Как писать в видеобуфер? Для начала надо в какой-либо сегментный регистр (например, es) записать сегментный адрес видеобуфера - 0b800h:
push 0b800h
pop es
Затем установить смещение в видеобуфере на нужное значение (0 - левый верхний угол, смещение для символа с координатами (x, y) вычисляется как (y * 80 + x) * 2).
Например:
mov di, (80 * 13 + 39) * 2 - точка (39, 13), середина экрана
Затем выводишь по адресу es:[di] то, что нужно:
mov byte ptr es:[di], 'A' - только символ
-------
mov byte ptr es:[di + 1], 1fh - только атрибут
-------
mov word ptr es:[di], (1fh shl 8) or 'A' - одновременно символ и атрибут
-------
mov ax, (1fh shl 8) or 'A'
stosw - одновременно символ и атрибут с автоматическим увеличением указателя в видеобуфере. Удобная команда для заполнения нескольких позиций.
Ответ отправлен: 23.10.2002, 12:29
Отправитель: Ayl
Отвечает Portnov
Приветствую Вас, Самохвалов Эдвард!
Самое надежное:
mov ax,0b800h
mov es,ax; т.к. в сегментные регистры число напрямую записать нельзя
mov al,blablabla; Чего вы выводить хотите
mov [es:0],al
С уважением, Portnov.
Ответ отправлен: 23.10.2002, 13:43
Отправитель: Portnov
Отвечает Broken Sword
Доброе время суток, Самохвалов Эдвард!
мда...
что за препода нынче пошли...
push 0B800
pop ES
mov AL,A1h
stosb
это один из множества вариантов...
а MOV-ом тебе препод правильно посоветовал писать - он быстрее строковых команд (хотя по твоему описанию препода он об этом ничего даже не подозревает)
Ответ отправлен: 22.10.2002, 22:02
Отправитель: Broken Sword
Отвечает Biv
Доброе время суток, Самохвалов Эдвард!
Если что-нибудь хочешь вывести на экран то сделать можно так
mov es, 0b800 ;Вроде как сегмент видео памяти
mov ax, 0 ;Смещение от начала
mov [es:ax], bx ; в bx, находится то, что надо выводить+параметр
ВСЕ вроде бы. Только не забудь в bx загнать то, что тебе нужно вывести.
Ответ отправлен: 22.10.2002, 22:29
Отправитель: Biv
Отвечает Dark_Lord
Здравствуйте, Самохвалов Эдвард!
mov ax,0B800h
mov es,ax
mov ax,нужное значение
stosw!
Ответ отправлен: 23.10.2002, 00:30
Отправитель: Dark_Lord
Отвечает Maverick
Добрый день, Самохвалов Эдвард!
Держи:
CSEG segment
assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG
org 100h
Begin:
push 0b800h ;Толкаем в стек адрес
pop es ;Выталкиваем его в es
mov ax,5 ;Пихаем в ax твое число a1
xor di,di ;Обнулим si
mov es:[di], ax ;Теперь записываем по адресу 0b800:00000 твое число a1
Mov ah,10h ;Остальное ненужно
int 16h
int 20h
CSEG ends
end Begin
Ответ отправлен: 24.10.2002, 05:34
Отправитель: Maverick
Отвечает Bob Johnson
Добрый день, Самохвалов Эдвард!
Ха... клевый у тебя препод.
Это делается так. В 16-разрядном режиме адрес памяти равен = сегментный регистр*16 + адрес.
И сег рег и адр могут быть от 0 до 65535. Вот и считай, какие тебе нужно значения занести куда, чтобы получить B8000h:
mov ax, 0B800h
mov es, ax
mov byte ptr es:[0], '$'
Вот, например, так.
Ответ отправлен: 24.10.2002, 12:54
Отправитель: Bob Johnson
Вопрос № 1584 |
Здравствуйте.
У меня возник вопрос по поводу видео?
Cегмент видеобуфера ,начинается с адреса 0B800:00000, но это же ОЗУ зачем тогда надо память в видеокарте ?
Спасибо.
Вопрос отправлен: 23.10.2002, 01:50
Отправитель: Паша
[Следующий вопрос >>] [Список вопросов]
Отвечает Biv
Доброе время суток, Паша!
Это действительно ОЗУ, но на область этго ОЗУ, начиная с адреса 0В800, ОТОБРАЖАЕТСЯ видеопамять.
Ответ отправлен: 23.10.2002, 20:39
Отправитель: Biv
Отвечает Broken Sword
Здравствуйте, Паша!
Это всего навсего Aliasing (или Shadowing), по русски - отображение, т.е. все что ты будешь писать в эту область будет автоматически пересылаться в ОЗУ видеокарты
Ответ отправлен: 23.10.2002, 14:48
Отправитель: Broken Sword
Отвечает Dark_Lord
Приветствую Вас, Паша!
Не всё так просто, при помощи регистров контроллера чипсета в реальном режиме (да и в защищённом можно) часть видеопамяти размером 64к или 128к (тоже в зависимости от установок) можнонайти по адресу 0B800h:0000h или 0A000h:0000h, при записи в них информация попадает в видеопамять!
Ответ отправлен: 23.10.2002, 14:47
Отправитель: Dark_Lord
Отвечает Артём Шегеда
Приветствую Вас, Паша!
Почему по этому адресу обращения идут к памяти видеоадаптера - ответят другие эксперты. А вот, "зачем надо память в видеокарте" - скажу я.
Представь себе двух друзей (подруг) желающих попить газировки из одной бутылки. Как они это будут делать?
1. Будут пить поочереди. Налицо простои каждого из друзей в ожидании своей дозы.
2. Возьмут стакан, в который нальют напиток. Один пьёт из стакана, другой - из бутылки. Это называется буферизация (упреждающее чтение).
2а. Возьмут два стакана. Почти то же самое, только буфер есть у обоих. Нагрузки на бутылку - никакой.
3. Возьмут две соломинки и будут дружно потягивать напиток. Это двухпортовый доступ. В аппаратуре реализация такой схемы относительно дорогА.
А теперь представь, что бутылка - это видеоОЗУ. Видеоадаптер обращается к нему практически непрерывно. И представь себе, что это ОЗУ используется ещё и процессором. Если не реализовывать специальных схем, то получится вариант 1, когда тормозить будет и вывод на монитор, и процессор в ожидании данных. Если сделать буферизацию (как в варианте 2), то нужно будет время на "наливание" данных в буфер, да и схемы "переливания" нужно городить... В общем, это не выход. Самым удачным был бы вариант 3, когда и ведеоадаптер и проц имеют постоянный доступ к ОЗУ. Но, как я уже сказал, это дорогое удовольствие, и делать двухпортовое ОЗУ объёмом 512 Мбайт - очень дорого.
Поэтому разработчики видеокарт ставят двухпортовое ОЗУ только на видеоадаптер, проецируя его на диапазон адресов A000:0000-B800:FFFF. А реальное ОЗУ становится недоступным (по крайней мере, простыми средствами)
Ответ отправлен: 23.10.2002, 12:01
Отправитель: Артём Шегеда
Отвечает Supra
Приветствую Вас, Паша!
То память карты, она ей самой нужна(посчитать,сохранить,ПОСЛАТЬ).
Ответ отправлен: 26.10.2002, 21:17
Отправитель: Supra
Отвечает Dmitry
Здравствуйте, Паша!
Ответ отправлен: 23.10.2002, 09:09
Отправитель: Dmitry
Отвечает LIFO
Доброе время суток, Паша!
Это память для прямого вывода в видеобуфер, а чтобы освободить проц от рутинных постоянных вычислений имееется память в видюхе+FPU(сопроцессора)
Ответ отправлен: 23.10.2002, 09:16
Отправитель: LIFO
Отвечает Gibbel
Здравствуйте, Паша!
Память видеокарты проецируется в эту область ОЗУ. Таким образом, обращаясь к этой области памяти ты обращаешься не к ОЗУ компьютера, а к ОЗУ видеокарты.
Ответ отправлен: 23.10.2002, 10:24
Отправитель: Gibbel
Отвечает Bob Johnson
Здравствуйте, Паша!
Этим адресам памяти традиционно соответствует видеопамять. Когда ты пишешь по адресу B800:0000, попадешь на самом деле не в ОЗУ, а в видеопамять.
Ответ отправлен: 24.10.2002, 12:55
Отправитель: Bob Johnson
Вопрос № 1585 |
Можно ли отформатировать только часть жесткого диска(на низком уровне), как это сделать через порты (без BIOS)? Заранее благодарю за ответ.
Вопрос отправлен: 23.10.2002, 04:05
Отправитель: Колян
[Следующий вопрос >>] [Список вопросов]
Отвечает Biv
Добрый день, Колян!
Конечно можно, если бы это было не так, то понятие логического диска было бы совершенно бессмысленным. Частично диск форматируется, например если у тебя два логических диска, и ты форматируешь один из них.
А что касается "как это сделать", то тут все сложнее - надо писать целое сочинение. Если хочешь, я тебе пришлю великолепную доку. Изъявляй свое желание сюда: shilvlad@mtu-net.ru
Ответ отправлен: 23.10.2002, 20:45
Отправитель: Biv
Отвечает Supra
Здравствуйте, Колян!
Можно, но запарится можно одними настройками на удаление одной дорожки.
Ответ отправлен: 26.10.2002, 21:15
Отправитель: Supra
Вопрос № 1586 |
Здравствуйте.
Растолкуйте мне пожалуйста следующее.
Я в с помощью отладчика CodeView правлю com-файл (незнаю как эту операцию называют профи). После этого я хочу заполучить этот файл уже отдельно. Вот мне терпеливо обьясняют, что отладчику функция Save не нужна. А как же тогда сделать?
Спасибо.
Вопрос отправлен: 23.10.2002, 08:20
Отправитель: Bayram Annanurov
[Следующий вопрос >>] [Список вопросов]
Отвечает St
Привет, Bayram Annanurov!
Нужно посмотреть в дебагере адреса, которые нужно исправить и затем открыть файл в HEX-редакторе (например HIEW) и исправить там (F4>F2>F3). Только адреса, которые вы видите в дебагере надо преобразовать в реальные смещения в файле (они не совпадают). Для com-файлов надо вычесть 100.
St
Ответ отправлен: 23.10.2002, 13:18
Отправитель: St
Отвечает Portnov
Здравствуйте, Bayram Annanurov!
Берете IDA, дизассемблите, сохраняете как asm-файл, правите, ассемблируете.
Ответ отправлен: 23.10.2002, 13:51
Отправитель: Portnov
Отвечает masquer
Добрый день, Bayram Annanurov!
Если файл, который ты правишь не пакованный/шифрованный, то записывай все изменения и потом уже в том же hiew правь. Ну, если пакованный - то сначала распаковать надобно, а потом править. Исправляя в отладчике ты исправляешь только содержимое памяти.
Ответ отправлен: 23.10.2002, 11:20
Отправитель: masquer
Отвечает Bob Johnson
Добрый день, Bayram Annanurov!
Как я понял, тебе нужно запатчить файл на диске. Так вот - в отладчике смотришь, какому смещению в файле соответствует выбранная строка и потом отдельно (например в Hiew) патчишь нужный файл по этому адресу.
Ответ отправлен: 25.10.2002, 14:18
Отправитель: Bob Johnson
Отвечает VicSimon
Здравствуйте, Bayram Annanurov!
Исправления могут быть 2-х видов: с изменением длины кода (в этом случае необходимо корректировать ВСЕ смещения в командах - здесь без дезассемблирования не обойдешься!) и без изменения. Например, команду mov ax, 4C00h (длина 3 байта) заменяем на цепочку из трех байтовых команд:
xor ax, ax
nop
nop.
Во втором случае я поступал так (делал в Турбо Дебаггере):
1. Ищем в отладчике команду, в которой нужно сделать исправления
2. Записываем на бумажке со смещения, соответствующего началу нужной команды, машинные коды программы (Байт 15-20 для верности) - т.н. сигнатура.
3. В hex-редакторе (удобнее всего в Hiew) ищем нужную сигнатуру в этом файле. Если таких строчек больше одной идем на п. 2. Важно получить УНИКАЛЬНУЮ сигнатуру!
4. В режиме команд ассемблера забиваем нужные команды, начиная с начала найденной сигнатуры...
Все. Таким образом мной была взломана программа TechHelp (не помню какой версии - дело было лет 6 назад) - по-русски на принтере отказывалась печатать...
Ответ отправлен: 23.10.2002, 08:45
Отправитель: VicSimon
Вопрос № 1587 |
Доброе время суток, уважаемые эксперты!
У меня такой вопрос:
а)Как лучше работать с Com1 - через BIOS или напрямую - через порты.
б)Можно ли в процессе работы с портом менять "постоянный бит четности"? т.е. послать два байта с битом четности = 1, затем послать два байта с битом четности = 0;
Жду ваших ответов.
Vitally
Вопрос отправлен: 23.10.2002, 12:16
Отправитель: Vitally
[Следующий вопрос >>] [Список вопросов]
Отвечает Biv
Доброе время суток, Vitally!
Зависит от целей и настроения, хотя по-моему через порты интереснее.
Ответ отправлен: 23.10.2002, 20:53
Отправитель: Biv
Отвечает Dark_Lord
Здравствуйте, Vitally!
Работать через порты всегда лучше, но иногда, в связи с кривыми руками, не предпочтительно. Хотя дело даже не в этом, если хочешь работать с чем-либо на уровне портов в/в надо очень чётко знать все аспекты портов данного устройства!
Ответ отправлен: 23.10.2002, 14:50
Отправитель: Dark_Lord
Отвечает Broken Sword
Добрый день, Vitally!
а). Как говорит Зубков, "реальная серьезная работа с последовательным портом возможна только при помощи прерываний", хотя IMO портов вполне достаточно.
б). Комбинация xx1 битов 5-3 в регистре LCR (3FB) - устанавливают программную (неаппаратную) четность.
Ответ отправлен: 23.10.2002, 15:19
Отправитель: Broken Sword
Отвечает Sensey
Здравствуйте, Vitally!
По моему лучше напрямую...
Бит четности выбирается таким образом, чтобы количество единичек в пакете информации (9-11 бит в зависимости от протокола) было либо четным, либо нечетным в зависимости от протокола.
Ответ отправлен: 23.10.2002, 12:56
Отправитель: Sensey
Отвечает Supra
Доброе время суток, Vitally!
Через БИОС проще, а посылать можно.
Ответ отправлен: 26.10.2002, 21:11
Отправитель: Supra
Отвечает Bob Johnson
Добрый день, Vitally!
а). Если под винды - то только с помощью их функций. Если под дос - как тебе удобней.
б) Я думаю, что в асинхронном режиме такое возможно.
Ответ отправлен: 24.10.2002, 12:57
Отправитель: Bob Johnson
Вопрос № 1588 |
Доброго времени суток, уважаемые Эксперты!
У меня имеется пара вопросиков. Короче, сначала опишу ситуацию: допустим, мне нужно
просканировать некий диапазон адресов (в протмоде, причем довольно большой). Так вот, это,
собственно, затруднений не вызывает, но при этом когда-нибудь да возникнет исключение #PF (отказ страницы).
Это, естественно, недопустимо. Как тут лучше поступить:
1. Отлавливать исключения через SEH (он уже установлен), но в таком случае как вернуть управление моему коду (в смысле корректно)?
2. Получить из cr3 базу каталога таблиц страниц (опять же, как? насколько я знаю инструкции с cr3 являются привилегированными и выполняются только в Ring0 ), потом таблицы страниц и просмотреть какие страницы находятся в памяти и к которым у меня есть доступ (но тут противоречие: чтобы получить содержимое cr3 у меня должен быть cpl=0 (так?), но в таком случае я могу читать любые страницы, независимо от требуемых привилегий)?
3. или какой-нибудь другой способ?
Предполагается, что не надо выяснять причину возникновения #PF.
С Уважением,
Dr.00py.
P.S. Не будет ли тот, кто будет отвечать любезен и не оставит ли мне свое мыло (на случай, если придется что-нибудь уточнять - спамить рассылку не хочу).
Вопрос отправлен: 23.10.2002, 12:27
Отправитель: Dr. 00py (stepipatov@mail.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает masquer
Доброе время суток, Dr. 00py!
1. Что значит корректно? После срабатывания эксепшена у тебя будет адрес команды, где оно возникло, ну дальше прыгай в безопасное место...
И вообще что значит сканировать, если ты под виндами (судя по SEH) то напиши драйвер, который будет тебе сканировать все что угодно.
З.Ы. Я так вопрос понял. Пока без мыла...
Ответ отправлен: 23.10.2002, 12:43
Отправитель: masquer
Отвечает Bob Johnson
Здравствуйте, Dr. 00py!
Мыло мое вот.
Если ты делаешь все из обычной проги, работающей на ring3, то вполне можешь патчить SEH. Проблем с возвратом управления быть не должно - просто сохраняй перед обращением к памяти значение адреса, а потом - восстанавливай оттуда.
2. Этого не надо - и запутаешься и ось не даст.
3. Да. Тебе нужна функция VirtualQueryEx - она сообщает тебе о состоянии страниц памяти, находящихся по заданному адресу заданного (!) процесса (т.е. можно и не свой процесс смотреть). смотри MSDN или пиши - у меня есть пример.
Ответ отправлен: 24.10.2002, 12:57
Отправитель: Bob Johnson
Вопрос № 1589 |
Не могу понять, в чем дело - пишу небольшую прогу под DPMI. Компилируется и работает в DOS-сессии Windows 98SE. Но категорически отказывается работать в FAR (если не запускать до нее никаких .bat или досовских .exe)
При попытке установить LDT дескриптор экранной области вылетает "программа выполнила недопустимую операцию и т.п."
В чем тут беда?
Приложение:
Вопрос отправлен: 23.10.2002, 12:59
Отправитель: Beeblebrox
[Следующий вопрос >>] [Список вопросов]
Отвечает Dark_Lord
Здравствуйте, Beeblebrox!
Far это приложение Windows!!!!!!
Ответ отправлен: 23.10.2002, 14:51
Отправитель: Dark_Lord
Форма отправки вопроса |
Форма может работать некорректно в почтовых программах "Microsoft Outlook" и "Microsoft Outlook Express". В программе The Bat! подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте, что в некоторых браузерах могут стоять запреты на открытие других окон, а также "чрезмерное" кэширование данных, при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.
© 2002 Команда RusFAQ.ru.
Вопрос и дополнение |
Ваш вопрос:
Приложение (если необходимо):
Получить ответов:
Выбор рассылки |
Программисту Assembler (41) C / C++ (27) Perl (4) Delphi (17) Pascal (23) Basic / VBA (8) Java / JavaScript (8) PHP (6) MySQL / MSSQL (10) |
Пользователю Windows 95/98/Me (33) Windows NT/2000/XP (22) "Железо" (30) Поиск информации (13) |
Администратору Windows NT/2000/XP (12) Linux / Unix (12) |
Юристу Гражданское право (9) Семейное право (6) Трудовое право (5) КоАП (6) |
Отправить вопрос всем экспертам выбранной рассылки.
© 2002 Россия, Москва. Авторское право: RusFAQ.ru |
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||