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

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.

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

Ваше имя:

Ваш e-mail:

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


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

Ваш вопрос:


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


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


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

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

В избранное