Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
RusFAQ.ru: программирование на языке Assembler
Информационный Канал Subscribe.Ru |
RusFAQ.ru: программирование на языке Assembler
Выпуск № 393
от 16.10.2002, 17:40
Администратор: Имя: Калашников О.А. URL: Информационный ресурс ICQ: 68951340 Россия, Москва |
О рассылке: Задано вопросов: 1528 Отправлено ответов: 4755 Активность: 311.1 %
|
Список экспертов, ответы которых опубликованы в данном выпуске |
Bob Johnson Статус: Опытный Общий рейтинг: 150.35 [Подробней >>] |
Maverick Статус: Доверительный Общий рейтинг: 147.94 [Подробней >>] |
Sensey Статус: Профессиональный Общий рейтинг: 125.19 URL: Страничка рассылки по Паскаля... Телефон: +38 (0572) 41-76-04 дом. [Подробней >>] |
VicSimon Статус: Доверительный Общий рейтинг: 103.86 [Подробней >>] |
Артём Шегеда Статус: Профессиональный Общий рейтинг: 116.68 URL: Пристанище неодинокого программиста [Подробней >>] |
masquer Статус: Профессиональный Общий рейтинг: 155.5 [Подробней >>] |
St Статус: Доверительный Общий рейтинг: 115.68 [Подробней >>] |
Biv Статус: Опытный Общий рейтинг: 117.95 [Подробней >>] |
Gibbel Статус: Профессиональный Общий рейтинг: 108.27 URL: Страничка обо мне и моих друзьях [Подробней >>] |
Dark_Lord Статус: Профессиональный Общий рейтинг: 131.23 [Подробней >>] |
nix Статус: Опытный Общий рейтинг: 105.97 [Подробней >>] |
LIFO Статус: Опытный Общий рейтинг: 130.18 Телефон: 8 01710 24758 [Подробней >>] |
Краткий перечень вопросов |
Вопрос № 1473. Здравствуйте! Прошу выслать мне на mail инфу по программированию на Asm. Может у кого есть електронн... (ответов: 3)
Вопрос № 1474. Во-первых спасибо за ответы на мои предыдущие вопросы, вроде все понятно. Во-вторых опять вопросы по... (ответов: 1)
Вопрос № 1475. Привет эксперты! Вопрос такой: Есть программа, не создающая никаких окон, Необходимо реализовать обр... (ответов: 5)
Вопрос № 1477. Доброе время суток! Мне нужно получить такую байду: если a=1 { б = х цикл { увеличиваем... (ответов: 5)
Вопрос № 1478. Здрасте! У меня SoftIce 4.01 NT но в XP незапускается, что мне с этим делать?... (ответов: 2)
Вопрос № 1480. Добрый... споткнулся в самом начале - не дайте полностью упасть:) - при первой же попытке ассемблир... (ответов: 8)
Вопрос № 1481. Помогите мне ссылками на ресурсы посвященные програмированию на асме по OpenGL.... (ответов: 1)
Вопросов: 7, ответов: 25
Вопрос № 1473 |
Здравствуйте!
Прошу выслать мне на mail инфу по программированию на Asm. Может у кого есть електронная версия книги зубкова.В инете нашел только две первые главы. А к нам в Мурманск не завозят.
Заранее благодарен.
Вопрос отправлен: 11.10.2002, 18:22
Отправитель: Noid (mudvayne@mail.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Bob Johnson
Приветствую Вас, Noid!
Приколист... Этой же инфы до фига. Ты уточняй, уточняй...
Ответ отправлен: 12.10.2002, 13:07
Отправитель: Bob Johnson
Отвечает Maverick
Доброе время суток, Noid!
Электронной версии Зубкова НЕТ!!!
Скачай себе рассылку "Ассемблер это просто...", очень хорошо все объяснено.
Зубковка можно посмотреть в интернет магазинах, но я в свое время так и не нашел.
Ответ отправлен: 12.10.2002, 06:19
Отправитель: Maverick
Отвечает Sensey
Доброе время суток, Noid!
Примерно 80 экспертов. Примерно половина кинет инфу - от 50 до 500 кил = метров 20-30 твой ящик выдержит
А кто-то из экспертов, не мпомню кто, может и 2 гига налить :)
Рисковый ты однако...
Проверь ящик...
Ответ отправлен: 14.10.2002, 10:57
Отправитель: Sensey
Вопрос № 1474 |
Во-первых спасибо за ответы на мои предыдущие вопросы, вроде все понятно.
Во-вторых опять вопросы появились:
1) Пробовал писать в LBF примерно так
...
mov ax,0h
mov es,ax
mov edi,PhysBasePtr ;(физ адрес LBF)
add edi,ebx ;(bx - лин. адресс точки)
mov es:[edi],dx
...
Ничего не получилось - комп виснет.
2) Пробовал писать в буфер, расположенный после кода, а потом этот буфер через перемещаемое окно 0a000h в видео. Тоже ничего не получилось - не виснет, но и ничего не выводит.
Буфер распологался прямо за прогой, поэтому вопрос: при запуске com проги все дальнейшие адреса свободны?
Код в приложении, может кто посмотрит и скажет в чем я неправ?
И еще. Bob Johnson посоветовал мне использовать DC или DirectDraw (Direct3D). Что такое DirectDraw (Direct3D) я вроде знаю, а DC? И где прочитать и про то и про другое?
Приложение:
Вопрос отправлен: 11.10.2002, 20:30
Отправитель: Dron_Gus (dron_gus_asm@pochtamt.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Bob Johnson
Здравствуйте, Dron_Gus!
Конечно ничего ты так в LFB не запишешь! Потому что всегда в 16-разрядном режиме (т.е. в реальном) пределы всех сегментов = 64К (и es тут не исключение!). Когда ты заносишь туда 0, то открываешь доступ через него к адресам 00000h - 0FFFFh и не более того! Для того, чтобы писать по значительно более высоким адресам (а LFB он на земле не валяется) - необходимы сегменты с пределами значительно больше 64к. Такие можно сделать только в защищенном режиме. Поэтому - создай GDT на 2 сегмента (первый - пустой, второй - для данных, база = 0, предел = 4Г), перейди в защищенный режим, там загрузи в es число 8 и спокойно уйди обратно в реальный режим. После этого адресуйся по es так, как ты написал выше. Но! Запрети прерывания на все время работы твоей проги, иначе - когда любой обработчик сделает push es и затем pop es, то в es окажется "обычное" число 8...
Да, практически все дальнейшее адресное пространство за сом-прогой свободно (может не до конца, т.е. не до 9FFFFh, потому что там тоже могут быть программы (или вирус)).
DC - это DeviceContext. Это - самый простой способ работать с графикой в Windows. Более сложно - это DirectDraw и Direct3D. DC - это как-бы "идентификатор" прямоугольной (и не только) области экрана, на которой ты можешь рисовать с помощью стандартных функций Windows.
Если хочешь программировать на ассемблере под Windows, бери примеры и смотри их, можно книги также. Ну, и конечно, MSDN.
P.S. Про Direct3D - DirectX8 SDK. Там есть очень понятные примеры.
Ответ отправлен: 12.10.2002, 13:07
Отправитель: Bob Johnson
Вопрос № 1475 |
Привет эксперты!
Вопрос такой:
Есть программа, не создающая никаких окон,
Необходимо реализовать обработчик по таймеру.
Поскольку таймер прикручивается к хэндлу окна, то хренли таким макаром
здесь это тикнет.
Пока идея такая: в привызове SetTimer хэндлом указать хэндл PRОGMAN'a
aka панель задач. И перехватить WM_TIMER. (в кратце)..
Вообще, идея возможно и бредовая, но пока ничего не лезет в голову..
Если вариант неудачный, то как бы Вы это реализовали?
Thank's!
--
Atma
Вопрос отправлен: 11.10.2002, 21:20
Отправитель: Atma Manas
[Следующий вопрос >>] [Список вопросов]
Отвечает VicSimon
Здравствуйте, Atma Manas!
В таких случаях окна обычно создаются! Но скрытые.
Например, вызов ShowWindow со вторым параметром SW_HIDE.
Ответ отправлен: 12.10.2002, 15:06
Отправитель: VicSimon
Отвечает Артём Шегеда
Здравствуйте, Atma Manas!
Если свехвысокая точность не нужна, то можно воспользоваться двумя функциеями: GetLocalTime и Sleep. Первая получает текущее время, вторая отдаёт управление системе.
Чем больше времени твоя программа будет спать, тем меньше система будет тормозить, но тем хуже точность определения времени.
Ответ отправлен: 12.10.2002, 17:16
Отправитель: Артём Шегеда
Отвечает Bob Johnson
Доброе время суток, Atma Manas!
Варианта два:
1. Создаешь невидимое окно и радуешься сообщению WM_TIMER, которое на него приходит.
2. Создаешь дополнительный поток (CreateThread), в котором постоянно вызываешь свою функцию и функцию Sleep, например:
while (running)
{
MyFunc ();
Sleep (20);
}
ExitThread (0);
Так можно получить точность больше, чем позволяет таймер. Но нужно учитывать, что MyFunc будет вызвана в этом случае из второго потока (не из основного!) и необходимо будет задуматься о синхронизации между ними (если понадобится).
Ответ отправлен: 12.10.2002, 13:07
Отправитель: Bob Johnson
Отвечает masquer
Добрый день, Atma Manas!
Можно привязаться к GetTickCount, можно создать окно и спрятать его, можно создать окно, например с такими параметрами invoke CreateWindowEx,WS_EX_LEFT,ADDR szClassName,NULL,WS_ICONIC, NULL, NULL, NULL, NULL, NULL, NULL, hInst, NULL
Ответ отправлен: 12.10.2002, 13:05
Отправитель: masquer
Отвечает St
Привет, Atma Manas!
Функции таймера в Windows действительно не очень всегда удобны для использования, не говоря уже о всесьма низкой точности (по крайней мере в Win9x). Однако вы можете создать свой таймер на основе цикла используя GetTickCount и Sleep (см Приложение). Об этих функциях вам стоит почитать в хелпе.
Для большей точности можно использовать QueryPerformanceCounter (после вызова QueryPerformanceFrequency) вместо GetTickCount.
St
Приложение:
Ответ отправлен: 12.10.2002, 23:27
Отправитель: St
Вопрос № 1477 |
Доброе время суток!
Мне нужно получить такую байду:
если a=1
{
б = х
цикл
{
увеличиваем б
------ ; довольно большой(длинный) код
}
}
если a=-1
{
б = у
цикл
{
уменьшаем б
------ ; довольно большой(длинный) код
}
}
как мне лучше сделать:
cmp a, 1
je 123
------
123:
------
или как я хочу, т.е. в программе (во время выполнения) заменяем inc на dec и число которое подставляется вместо х и у. Только я не знаю как это правильно сделать. По идее узнаем в озу аддрес:смещение данной команды и заменяем ее на нужную?
Вопрос отправлен: 12.10.2002, 04:06
Отправитель: Илья (b.i@date.by)
[Следующий вопрос >>] [Список вопросов]
Отвечает Артём Шегеда
Доброе время суток, Илья!
Кроме, того, что корректировать код - неэстетично, а иногда и невозможно, такое решение не будет иметь выигрыша ни по скорости, ни по объёму.
Приложение:
Ответ отправлен: 12.10.2002, 17:49
Отправитель: Артём Шегеда
Отвечает Biv
Доброе время суток, Илья!
Если я правильно понял, что ты хочешь узнать как твоя модель выглядит на асме, то вот что я могу тебе предложить (грубые наброски):
Два варианта.
Вот первый (самый не геморный)
cmp a, 1
je M1
cmp a, -1
je M2
jmp EXIT
M1:
mov b, x
mov cx, (кол-во повторов)
for1:
inc b
; длинный код
loop for1
jmp (продолжение программы)
M2:
mov b, y
mov cx, (кол-во повторов)
for2:
dec b
; длинный код
loop for2
jmp (продолжение программы)
Вот второй(только я сомневаюсь, что понял тебя правильно). Этот вариант подходит к твоей задаче, только если два блока (см. М1 и М2) различаются только inc'ом и dec'ом:
; для начала запихнем в bx смещение команды inc, оно "равно" метке for1
mov bx, for
; проверяем две феньки, когда а = 1 и а = -1
cmp a, 1 ; если а = 1 то пусть все остается как есть, разве что
; в b засунем значение х
je M1 ; поэтому делаем первое ответвление
cmp a, -1 ; а вот если а = -1, то придется менять команду на dec, но
; это уже второе ответвление
je M2
M1:
mov b, x
; Если в двух случаях кол-во повотров одинаково, то
; следующую строчку можно убрать в тело Master_code'а
mov cx, (кол-во повторов)
jmp Master_code
M2:
mov b, y
mov cx, (кол-во повторов)
; Вот здесь-то и происходит самое интересное мы inc ;превращаем в dec (только нужно проверить на правильный байт я заменяю)
mov [bx+1], 0Eh
; а дальше все вроде ясно
master code:
for:
inc b
; длинный код
loop for
jmp (продолжение программы)
Ну вот и все , если что, пиши на мыло, что бы не спамить рассылку
Ответ отправлен: 12.10.2002, 23:48
Отправитель: Biv
Отвечает Bob Johnson
Приветствую Вас, Илья!
Если ты пишешь программу для современного процессора, то лучше вообще не использовать самомодифицирующийся код, потому что процессор кэширует (предварительно считывает и начинает декодировать) команды. А если ты в этот момент их поменяешь, что ему придется заново считывать и декодировать - это будет тормозно. Поэтому же процессор могут тормозить команды условного перехода (если он их не угадает). Лучше по возможности заменять условный переход на что-то типа cmp, sbb. И лучше использовать переменную в памяти, чем самомодифицирующийся код - такая переменная попадет в кэш данных при первом обращении и в дальнейшем процессор будет работать с кэшем, а не с реальной памятью, что почти также быстро, как и с обычным регистром.
Но в твоем случае, скорее всего, от одного условного перехода не избавишься, поэтому можно так:
cmp a, 1
jne not1
mov [б], x
mov [addб], 1
...
not1:
mov [б], y
mov [addб], -1
...
Ответ отправлен: 12.10.2002, 20:04
Отправитель: Bob Johnson
Отвечает masquer
Здравствуйте, Илья!
Если а принимает значения только 1 и -1, то можно так (быстрее и проще):
neg eax
jl @@1
;а=1, точнее а положительное
dec ebx
jmp @@somewhere
;а=-1б а - отрицательное
@@1: inc ebx
@@somewhere:
Ответ отправлен: 12.10.2002, 12:49
Отправитель: masquer
Отвечает Sensey
Приветствую Вас, Илья!
Я бы лично сделал так:
Можно на С пример?
if (a==1) {b=x}
if (a==-1) {b=y}
{ b+=a;
цикл
}
Ответ отправлен: 14.10.2002, 12:00
Отправитель: Sensey
Вопрос № 1478 |
Здрасте!
У меня SoftIce 4.01 NT но в XP незапускается, что мне с этим делать?
Вопрос отправлен: 12.10.2002, 14:07
Отправитель: Denis
[Следующий вопрос >>] [Список вопросов]
Отвечает masquer
Доброе время суток, Denis!
Ты ж понимаешь, что-то нужно менять - тут два варианта - либо ось, либо айс. Поставь айс поновее.
Ответ отправлен: 13.10.2002, 14:50
Отправитель: masquer
Отвечает Gibbel
Доброе время суток, Denis!
Ответ отправлен: 12.10.2002, 14:22
Отправитель: Gibbel
Вопрос № 1480 |
Добрый...
споткнулся в самом начале - не дайте полностью упасть:) -
при первой же попытке ассемблирования получил:
>ML.EXE prog01.asm/AT
Microsoft
Copyright
Assembling: prog01.asm/AT
MASM : fatal error A1000: cannot open file : prog01.asm/AT
перевести нетрудно, но не могу понят причину.
если не трудно и не смешно, помогите.
спасибо.
Вопрос отправлен: 12.10.2002, 16:41
Отправитель: rovver
[Следующий вопрос >>] [Список вопросов]
Отвечает Dark_Lord
Здравствуйте, rovver!
Перед /АТ нужен пробел, так как с данными параметрами происходит попытка открыть файл "prog01.asm/AT"
Ответ отправлен: 12.10.2002, 17:58
Отправитель: Dark_Lord
Отвечает nix
Здравствуйте, rovver!
Все елементарно:
ML.EXE prog01.asm /AT
^
пробел
Будь внимательней.
Ответ отправлен: 14.10.2002, 06:16
Отправитель: nix
Отвечает St
Привет, rovver!
Посмотрите еще раз внимательнее на то что пишет масм при наборе команды ML.exe /?
Ключи начинающиеся со знака / надо ставить во-первых через пробелы, а во-вторых до указания имени asm-файла
St
Ответ отправлен: 12.10.2002, 22:08
Отправитель: St
Отвечает Bob Johnson
Добрый день, rovver!
После prog01.asm и перед /AT поставь пробел!
Ответ отправлен: 13.10.2002, 15:03
Отправитель: Bob Johnson
Отвечает LIFO
Добрый день, rovver!
Перед prog01.asm и /AT должен быть пробел(т.к. /AT - это опция а prog01.asm - это имя файла, а у тебя получается, что твой файл называется prog01.asm/AT а не prog01.asm
Ответ отправлен: 12.10.2002, 22:03
Отправитель: LIFO
Отвечает Biv
Доброе время суток, rovver!
Сто пудов работает:
ML.EXE prog01.asm /AT
Выделяй и вставляй
Ответ отправлен: 13.10.2002, 00:07
Отправитель: Biv
Отвечает Maverick
Доброе время суток, rovver!
Ну, во первых погляди в какой папке у тебя стоит Masm, например Tasm не любит русские и длинные названия файлов и папок.
Во вторых погляди, может после Ml.exe в командной строке у тебя не стоит пробел.
Ну и в третьих посмотри чтоб программа, которую ты хочешь ассемблировать находится в том же каталоге, что и Ml или указывай полный путь к своему файлу.
Например:
Ml.exe c:myprogasmprog01.asm /AT
Ответ отправлен: 14.10.2002, 11:46
Отправитель: Maverick
Отвечает Gibbel
Здравствуйте, rovver!
поставь пробел между prog01.asm и /AT
Ответ отправлен: 14.10.2002, 12:06
Отправитель: Gibbel
Вопрос № 1481 |
Помогите мне ссылками на ресурсы посвященные програмированию на асме по OpenGL.
Вопрос отправлен: 12.10.2002, 17:39
Отправитель: Torax (torax@dotes.west.energy.gov.ua)
[Следующий вопрос >>] [Список вопросов]
Отвечает Biv
Приветствую Вас, Torax!
Приличное кол-во примеров есть на wasm.ru
Ответ отправлен: 13.10.2002, 00:07
Отправитель: Biv
Форма отправки вопроса |
Форма может работать некорректно в почтовых программах "Microsoft Outlook" и "Microsoft Outlook Express". В программе The Bat! подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте, что в некоторых браузерах могут стоять запреты на открытие других окон, а также "чрезмерное" кэширование данных, при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.
© 2002 Команда RusFAQ.ru.
Вопрос и дополнение |
Ваш вопрос:
Приложение (если необходимо):
Получить ответов:
Выбор рассылки |
Программисту Assembler (43) C / C++ (31) Perl (5) Delphi (20) Pascal (25) Basic / VBA (10) Java / JavaScript (10) PHP (9) MySQL / MSSQL (14) |
Пользователю Windows 95/98/Me (37) Windows NT/2000/XP (25) "Железо" (34) Поиск информации (13) |
Администратору Windows NT/2000/XP (14) Linux / Unix (15) |
Юристу Гражданское право (6) Семейное право (4) Трудовое право (3) КоАП (5) |
Отправить вопрос всем экспертам выбранной рассылки.
© 2002 Россия, Москва. Авторское право: RusFAQ.ru |
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||