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

RusFAQ.ru: программирование на языке Assembler


Информационный Канал Subscribe.Ru

RusFAQ.ru: программирование на языке Assembler

Выпуск № 746
от 08.07.2004, 09:20

Администратор:
Имя: Калашников О.А.
URL: Информационный ресурс
ICQ: 68951340
Россия, Москва
О рассылке:
Задано вопросов: 5571
Отправлено ответов: 15115
Активность: 271.3 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

bocha
Статус: Опытный
Общий рейтинг: 137.09
[Подробней >>]
Dark_Lord
Статус: Профессиональный
Общий рейтинг: 109.48
[Подробней >>]
Tigran K. Kalaidjian
Статус: Профессиональный
Общий рейтинг: 194.93
URL: Оптимизация ПК
[Подробней >>]
 
fC
Статус: Профессиональный
Общий рейтинг: 132.11
URL: Самоподобие сетевого трафика
[Подробней >>]
flasher
Статус: Доверительный
Общий рейтинг: 105.46
[Подробней >>]
Dragoon
Статус: Доверительный
Общий рейтинг: 106.68
[Подробней >>]
 
Ayl
Статус: Профессиональный
Общий рейтинг: 116.68
[Подробней >>]
Евгений Иванов
Статус: Профессиональный
Общий рейтинг: 133.79
URL: Super Assembler Software
Телефон: НСС +7 831 3107039
[Подробней >>]
Стас
Статус: Опытный
Общий рейтинг: 126.89
[Подробней >>]
 
Snowm@n
Статус: Опытный
Общий рейтинг: 110.33
[Подробней >>]
Foamplast
Статус: Профессиональный
Общий рейтинг: 139.73
URL: мой личный сайт
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 5537. Hi всем. У меня такой вопрос под DOS. Есть 2D игра, а в этой игре два объекта состоящие только из ли... (ответов: 3)
Вопрос № 5538. Скачал SoftIceNT, установил, жму Ctrl+D, но ничего не происходит. Т.е. SoftIce по-видимому запускает... (ответов: 1)
Вопрос № 5539. Здравствуйте, уважаемые эксперты! Мне 16 лет, учусь программированию уже 3 года, и вот что знаю: я... (ответов: 3)
Вопрос № 5540. Привет Эскпертам! Как узнать последний бит(0 или 1) регистра EAX?... (ответов: 6)
Вопрос № 5542. Привет Всем! Подскажите плиз, как прочитать строку до определённого знака? например: есть строка &qu... (ответов: 4)
Вопрос № 5543. code? i db 256 dup(?) А как можно выделить для переменой i память(в самой программе)? к примеру 512 ... (ответов: 3)
Вопрос № 5544. mov eax, 25 mov ecx,5 div ecx Почему выходит ошибка Integer Overflow? И еще как в памяти записаны чи... (ответов: 4)
Вопрос № 5545. Привет Стас! >DOS? Windows? Другие подробности? Windows, нуно копировать текст до ! знака, ну а пото... (ответов: 1)

Вопросов: 8, ответов: 25


 Вопрос № 5537

Hi всем. У меня такой вопрос под DOS.
Есть 2D игра, а в этой игре два объекта
состоящие только из линий при встрече
проходят сквозь друг друга, как привидения.
Как определить пересечение двух линий???



Вопрос отправлен: 01.07.2004, 16:25
Отправитель: Vitaliy (Lytonin@rambler.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает bocha

Приветствую Вас, Vitaliy!
Открой учебник по матиматике за 7 класс и там посмотри как решается система двух линейных уравнений.

Ответ отправлен: 02.07.2004, 16:18
Отправитель: bocha


Отвечает Dark_Lord

Доброе время суток, Vitaliy!
Тут математика. У каждой прямой есть уравнение, в программе его можно записать как x*A+y*B=C, где A,B,C уникальны для каждой прямой (о том как их высчитать смотри учебник по алгебре!). Если решить систему уравнений из двух уравнений прямых, то получаем точку пересечения (если не паралельны), потом смотришь, находится ли точка пересечения в пределах линии, которая лежити на прямой, которую ты использовал для расчёта.

Ответ отправлен: 01.07.2004, 19:36
Отправитель: Dark_Lord


Отвечает Tigran K. Kalaidjian

Приветствую Вас, Vitaliy!
Я скажу первое, что в голову пришло, но может дать ход мысли:
1. Если пользуетесь отрисовкой линии без готовых процедур, то элементарно проверять цвет точки, которую Вы хотите закрашивать – а может там кто-то поработал.
2. Если с готовыми процедурами, то производить вывод в другую область памяти, нежели используемую область видео (скажем, неиспользуемую страницу видеопамяти), причём закрасить эти 2 объекта в разные цвета, скажем цвет_1 и цвет_2. Отрисовка каждого объекта происходит по отдельности, т.е., скажем, сперва первый, затем второй. Затем вывести всё тоже на другую страницу видеопамяти, но в другой очерёдности, сперва второй, потом первый. В конце концов, сравнить интересующие области картинки: область пересечения на одной странице будет цвета цвет_1, а на другой цвет_2, остальные области будут идентичными по цвету. Теперь мы знаем, где находится искомая область и можем менять картинки на используемой видеостранице.
Вот и всё: размышления из теории множеств =)
2ЭКСПЕРТЫ: я вернулся. Жаль не видно многих знакомых имён...


Ответ отправлен: 01.07.2004, 22:36
Отправитель: Tigran K. Kalaidjian


 Вопрос № 5538

Скачал SoftIceNT, установил, жму Ctrl+D, но ничего не происходит.
Т.е. SoftIce по-видимому запускается(курсор перестает двигаться), однако само окно не рисуется. При повторном нажатии Ctrl+D SoftIce закрывается (если он вообще открывался). Что делать?
Thanks.



Вопрос отправлен: 03.07.2004, 02:52
Отправитель: RARR

[Следующий вопрос >>] [Список вопросов]

Отвечает fC

Доброе время суток, RARR!
Версия Soft Ice какая? Версия Windows какая?

Ответ отправлен: 03.07.2004, 03:05
Отправитель: fC


 Вопрос № 5539

Здравствуйте, уважаемые эксперты!
Мне 16 лет, учусь программированию уже 3 года, и вот что знаю:

язык уровень знаний

php среднее
vb хорошо
pascal среднее
asm мало
html среднее
js среднее
c++ мало

Как Вы считаете это нормально за 3 года?



Вопрос отправлен: 03.07.2004, 12:52
Отправитель: highQ

[Следующий вопрос >>] [Список вопросов]

Отвечает flasher

Здравствуйте, highQ!
Мало! :)
html - чё там учить-то, что ты на среднее знаешь :)
лучшеб хорошо изучил асму и си.
Ну а ваще-то ты ещё молод, всё у тя в переди.
Удачи!

Ответ отправлен: 03.07.2004, 15:15
Отправитель: flasher


Отвечает Tigran K. Kalaidjian

Здравствуйте, highQ!
Хорошо твёрдо программировать на одном языке - остальное можно по справочникам. На личном примере - после паскаля и ассемблера можно любой язык освоить за час (только, может быть на с++ больше времени потребуется)
За три года? Хм... Нормально - главное не сроки, а качество программирования.
Мне, кстати, тоже 16 лет.=) Паскаль и Си изучил в 9-м классе, ассемблер - в 10-м. В 11-м не до этого было.

Ответ отправлен: 03.07.2004, 20:44
Отправитель: Tigran K. Kalaidjian


Отвечает Dragoon

Здравствуйте, highQ!
Решай сам.
Я за год (полный год будет в октябре)
php мало
c++ мало
pascal - хорошо
delphi - хорошо
asm - хорошо
html - средне
java - мало


Ответ отправлен: 04.07.2004, 15:30
Отправитель: Dragoon


 Вопрос № 5540

Привет Эскпертам!
Как узнать последний бит(0 или 1) регистра EAX?



Вопрос отправлен: 03.07.2004, 13:21
Отправитель: hd

[Следующий вопрос >>] [Список вопросов]

Отвечает Ayl

Здравствуйте, hd!
Последний - это какой? Младший или старший?
Если младший, то например, так:
test eax, 1
jz bit0
bit1:
или, если значение в регистре не нужно, то так:
rcr eax, 1
jc bit1
bit0:
Для старшего можно так:
test eax, 80000000h
jz bit0
bit1:
или так:
rcl eax, 1
jc bit1
bit0:


Ответ отправлен: 05.07.2004, 12:40
Отправитель: Ayl


Отвечает Tigran K. Kalaidjian

Доброе время суток, hd!
Последний справа или слева ?
----------------------
and eax, 1 ;оставляем последний бит - остальные срезаем
jz zero
...
nonzero: ;если единица
...
zero: ;если ноль
----------------------
Естественно, если нужно, eax заранее сохраняем.

Ответ отправлен: 03.07.2004, 20:28
Отправитель: Tigran K. Kalaidjian


Отвечает Евгений Иванов

Здравствуйте, hd!
наконец-то вопрос чисто по программированию и по Ассемблеру..
shl eax,1
jc bit_is_set
;-----------
test eax, 8000h
jnz bit_is_set
;-------------
удачи!

* EMan: -=- Любовь существует! =-=


Ответ отправлен: 04.07.2004, 12:27
Отправитель: Евгений Иванов


Отвечает Стас

Доброе время суток, hd!
Еще лучше test eax,1
Test это то же что и and только не влияет на сам регистр, а только на флаги. (Проверить старший бит - test eax,80000000)

Ответ отправлен: 03.07.2004, 21:09
Отправитель: Стас


Отвечает bocha

Доброе время суток, hd!
and eax, 80000000h
jnz куда_надо_если_32_й_бит_eax_единица

Ответ отправлен: 03.07.2004, 14:51
Отправитель: bocha


Отвечает Snowm@n

Приветствую Вас, hd!
and eax,1

Ответ отправлен: 03.07.2004, 18:18
Отправитель: Snowm@n


 Вопрос № 5542

Привет Всем!
Подскажите плиз, как прочитать строку до определённого знака?
например: есть строка "Flashik!text", нуно читать до "!" и вывести на экран, а именно слово "Flashik".
Посиба заранее!



Вопрос отправлен: 03.07.2004, 16:04
Отправитель: Flashik

[Следующий вопрос >>] [Список вопросов]

Отвечает Ayl

Добрый день, Flashik!
Ну а в чем проблема? Сканируешь строку и сравниваешь:
lea si, stroka
@@rep:
lodsb
cmp al, '!'
jz @@cont
int 29h
jmp short @@rep
@@cont:
...
stroka db 'Flashik!text'


Ответ отправлен: 05.07.2004, 12:43
Отправитель: Ayl


Отвечает Tigran K. Kalaidjian

Добрый день, Flashik!
см. приложение
2ЭКСПЕРТЫ: Я таки поступил на ФизФак МГУ !!!

Приложение:

Ответ отправлен: 04.07.2004, 12:52
Отправитель: Tigran K. Kalaidjian


Отвечает Стас

Приветствую Вас, Flashik!
DOS? Windows? Другие подробности?
Вообщем ищешь "!" scasb меняешь на 00h и выводишь.
Если нельзя изменять - копируешь до найденого "!" в другое место, ставишь там 0 и выводишь.

Ответ отправлен: 03.07.2004, 21:12
Отправитель: Стас


Отвечает Snowm@n

Доброе время суток, Flashik!
i:=0;
while s[i]<>'!' do write(s[i]);

Переделать в ASM дело техники...

Ответ отправлен: 03.07.2004, 17:57
Отправитель: Snowm@n


 Вопрос № 5543

code?
i db 256 dup(?)
А как можно выделить для переменой i память(в самой программе)? к примеру 512 байт.



Вопрос отправлен: 03.07.2004, 17:37
Отправитель: hd

[Следующий вопрос >>] [Список вопросов]

Отвечает Евгений Иванов

Приветствую Вас, hd!
Call GlobalAlloc, GPTR, 512

* EMan: -=- Любовь существует! =-=


Ответ отправлен: 04.07.2004, 12:28
Отправитель: Евгений Иванов


Отвечает Стас

Доброе время суток, hd!
Для DOS: функции 48h,49h,4ah 21 прерывания.
Для windows: GlobalAlloc, LocalAlloc.
Вопрос неоднократно поднимался. См. рассылку.

Ответ отправлен: 03.07.2004, 21:19
Отправитель: Стас


Отвечает Foamplast

Добрый день, hd!
Честно говоря, я вопрос не понял. При Вашем способе записи память выделяется в самой программе.
Догадываюсь: вопрос был "как программно выделить память?"
Ответ:
Для этого необходимо вызвать соответствующие функции операционной системы. Под ОС "Виндовс" это достигается с помощью функций GetProcessHeap(), HeapAlloc(), HeapFree(), HeapReAlloc(). Ещё могут понадобиться HeapCreate() и HeapDestroy().
Принципы работы:
  • С помощью GetProcessHeap() обретается хэндл кучи процесса. Он используется при вызовах HeapAlloc() и HeapFree().
  • С помощью HeapAlloc() память выделяется, с помощью HeapFree() - возвращается.
  • Если в выделенный участок были записаны данные, и ожидаются дополнительные данные, а размеров этого участка не хватает - используется HeapReAlloc().
  • Если ожидаемый совокупный размер данных больше размеров кучи процесса, можно использовать HeapCreate() и HeapDestroy() для создания кучи и её удаления (в конце работы). Функция HeapCreate() также позволяет создавать растущую кучу, размер которой увеличивается при необходимости.
  • Функции HeapAlloc() и HeapReAlloc() возвращают указатели на выделенную память.
Пример:
Если необходимо выделить 512 байт под переменную i, то делается следующее:
GetProcessHeap
Jz .errgetheap ; случилась ошибка получения хэндла кучи
Mov [hHeap], Eax
HeapAlloc [hHeap], HEAP_ZERO_MEMORY, 512
Test Eax, Eax
Jz .erralloc ; случилась ошибка выделения памяти
Mov [pointer_to_i], Eax
...
Mov Eax, [pointer_to_i]
Mov Cl, [Eax + 131] ; чтение из 132-го байта
Mov [Eax + 146], Cl ; запись в 147-й байт
...
HeapFree [hHeap], 0, [pointer_to_i]
Test Eax, Eax
Jz .errfree ; случилась ошибка освобождения памяти
Mov [pointer_to_i], 0 ; чтоб знать, что память не выделена (освобождена)
UNIX:
Используются функции malloc(), free() realloc().



Ответ отправлен: 07.07.2004, 16:12
Отправитель: Foamplast


 Вопрос № 5544

mov eax, 25
mov ecx,5
div ecx
Почему выходит ошибка Integer Overflow? И еще как в памяти записаны числа с запятой?



Вопрос отправлен: 03.07.2004, 19:25
Отправитель: hd

[Следующий вопрос >>] [Список вопросов]

Отвечает Евгений Иванов

Добрый день, hd!
забыл
sub edx,edx
* EMan: -=- Любовь существует! =-=


Ответ отправлен: 04.07.2004, 12:28
Отправитель: Евгений Иванов


Отвечает Dark_Lord

Добрый день, hd!
1) Обнули edx перед делением и всё заработает
2) Смотря какие числа с запятой! Числа с плавающей точкой находятся в формате IEEE, а с фиксированной точкой как и обычные целые.

Ответ отправлен: 03.07.2004, 19:48
Отправитель: Dark_Lord


Отвечает Ayl

Доброе время суток, hd!
Потому что команда div ecx подразумевает деление 64-разрядного числа, содержащегося в регистрах edx:eax на 32-разрядный операнд (т.е. регистр ecx). Ты не очистил регистр edx - поэтому получил переполнение.


Ответ отправлен: 05.07.2004, 13:27
Отправитель: Ayl


Отвечает Tigran K. Kalaidjian

Доброе время суток, hd!
2 ответа по очереди:
1. вставьте в начале
xor edx, edx
или замените
mov ecx,5
на
mov cx, 5
Дело в том, что когда вы указываете в качестве параметра ecx, то выполняется вот такая операция
eax = edx:eax / ecx, что может вызвать переполнение.
2. Несколько битов на число A, несколько на B, где (A*2^B) – нужное число с плавающей запятой. Подробнее читайте у Зубкова.

Ответ отправлен: 03.07.2004, 21:13
Отправитель: Tigran K. Kalaidjian


 Вопрос № 5545

Привет Стас!
>DOS? Windows? Другие подробности?
Windows, нуно копировать текст до ! знака, ну а потом забить нулём и вывести - это не проблема.
Я так понял scasb - ищет букву в троке, но как мне скопировать вес текст до этой буквы?
Посиба заранее!



Вопрос отправлен: 04.07.2004, 09:16
Отправитель: Flashik

[Следующий вопрос >>] [Список вопросов]

Отвечает Стас

Здравствуйте, Flashik!
Не в строке, а в пямяти. DS:DI-начало блока памяти, CX-протяженность, AL-что ищем. CLD ищем вперед, STD ищем назад. Repnz scasb-искать пока не найдем.
Загружай файл в память и сканируй. Если файл большой>65535 байт загружай блоками (т.к. scasb может сканировать на протяжении 65535(регистр CX) байт) или просто менять сегмент(для DOS) или смещение (в DI) (для виндов(если файл лежит в одном большом куске памяти)).

Ответ отправлен: 04.07.2004, 20:53
Отправитель: Стас



Форма отправки вопроса

Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

(C) 2002-2003 Команда RusFAQ.ru.

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

Ваше имя:

Ваш e-mail:

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


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

Ваш вопрос:


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


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


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

Программисту
Assembler (27)
C / C++ (14)
Perl (4)
Builder / Delphi (19)
Pascal (27)
Basic / VBA (6)
Java / JavaScript (5)
PHP (13)
Криптография (8)
WinAPI (12)
Радиоэлектроника (12)
Пользователю
Windows 95/98/Me (41)
Windows NT/2000/XP (56)
"Железо" (38)
Поиск информации (16)
Администратору
Windows NT/2000/XP (33)
Linux / Unix (16)
Юристу
Гражданское право (9)
Семейное право (7)
Трудовое право (8)
КоАП (6)

Отправить вопрос всем экспертам выбранной рассылки.




Задать вопрос | Регистрация эксперта | Поиск в базе | Чат | Форумы | Новости
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.


Яндекс цитирования
© 2001-2004 Россия, Москва. Авторское право: Калашников О.А.

http://subscribe.ru/
E-mail: ask@subscribe.ru
Адрес подписки
Отписаться

В избранное