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

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.

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

Ваше имя:

Ваш e-mail:

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


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

Ваш вопрос:


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


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


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

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

В избранное