Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
RusFAQ.ru: программирование на языке Assembler
Информационный Канал Subscribe.Ru |
RusFAQ.ru: программирование на языке Assembler
Выпуск № 689
от 16.01.2004, 23:52
Администратор: Имя: Калашников О.А. URL: Информационный ресурс ICQ: 68951340 Россия, Москва |
О рассылке: Задано вопросов: 4832 Отправлено ответов: 13608 Активность: 281.6 %
|
Список экспертов, ответы которых опубликованы в данном выпуске |
_vt Статус: Профессиональный Общий рейтинг: 118.03 [Подробней >>] |
Portnov Статус: Профессиональный Общий рейтинг: 107.82 URL: Мой сайтик... [Подробней >>] |
Gibbel Статус: Профессиональный Общий рейтинг: 106.06 URL: Savage Metal Club - жизнь в стиле рок-н-ролл Телефон: +7 901 710 3146 [Подробней >>] |
Евгений Иванов Статус: Профессиональный Общий рейтинг: 136.89 URL: Super Assembler Software Телефон: Пчёлка +7 905 6601206 [Подробней >>] |
Bob Johnson Статус: Профессиональный Общий рейтинг: 146.29 URL: Программирование [Подробней >>] |
never_again Статус: Опытный Общий рейтинг: 125.99 [Подробней >>] |
Artemy Статус: Опытный Общий рейтинг: 117.52 Телефон: 8 905 549 38 66 [Подробней >>] |
VOVAN Статус: Начальный Общий рейтинг: 107.19 [Подробней >>] |
Ayl Статус: Профессиональный Общий рейтинг: 116.5 [Подробней >>] |
SedHg Статус: Доверительный Общий рейтинг: 115.41 [Подробней >>] |
vitya Статус: Профессиональный Общий рейтинг: 108.38 [Подробней >>] |
Краткий перечень вопросов |
Вопрос № 4790. Как разархивировать файлы и запустить прогу MASM 6.12, как преврать DISK1-5 and Patch в каталог буд... (ответов: 1)
Вопрос № 4792. Ув. эксперты! Включаю в rc - файл обе иконки - 16x16 и 32x32,но каждый раз работает только одна,та,к... (ответов: 2)
Вопрос № 4793. господа эксперты! забудте про мой предыдущий вопрос! сам разобрался. Это просто я - дятел, сначала с... (ответов: 1)
Вопрос № 4795. Я не так давно задавал вопрос о паролях в Ворде, впринципе все ответы, за которые я благодарен, свод... (ответов: 2)
Вопрос № 4796. Здравствуйте уважаемые эксперты. У меня вопрос не потеме, но может кто знает: как в си, если мне нуж... (ответов: 5)
Вопрос № 4797. Спасибо всем ответившим. Самое интересное то, что все три эксперта ответили одинаково :-)). У меня т... (ответов: 1)
Вопрос № 4799. Зрасте. Есть такая штучка как файл BGI. Хотелось бы этой штучке зелезть под юбку и хорошенько пошари... (ответов: 2)
Вопрос № 4802. >"резидентный сторож" (при удалении какого-то файла с дискеты - востанавливать его.) Спа... (ответов: 1)
Вопрос № 4803. Здравствуйте уважаемые All! Я только недавно начал заниматься программированием на ассемблере и... (ответов: 5)
Вопрос № 4804. Здравствуйте! У меня есть программа на C++Builder (Win9X), где есть функция, выполненная в виде ассе... (ответов: 5)
Вопросов: 10, ответов: 25
Вопрос № 4790 |
Как разархивировать файлы и запустить прогу MASM 6.12, как преврать DISK1-5 and Patch в каталог будующей программы. Заранее благодарю.
Вопрос отправлен: 11.01.2004, 19:57
Отправитель: Санёк
[Следующий вопрос >>] [Список вопросов]
Отвечает _vt
Здравствуйте, Санёк!
Если ты скачал всё в одном архиве, распакуй куда нибудь. Потом заходи в папку DISK1 и запускай install.exe.
--- E-Man 1.5+ : Life begins at 1000 MHz!
Ответ отправлен: 13.01.2004, 01:27
Отправитель: _vt
Вопрос № 4792 |
Ув. эксперты!
Включаю в rc - файл обе иконки - 16x16 и 32x32,но каждый раз работает только одна,та,кторая расположена первой в ресурсах.А эти иконки очень сильно искажаются,если стоят не на своем месте.Подскажите,плз,как выйти из положения,чтобы в Проводнике была видна 16х16,и там,где нужно - 32х32?
Спасибо.
Вопрос отправлен: 11.01.2004, 21:51
Отправитель: Alex
[Следующий вопрос >>] [Список вопросов]
Отвечает Portnov
Приветствую Вас, Alex!
Возьмите нормальный редактор иконок (напр., IconWorkshop или AWIcons), и сделайте в нем .ico-файл, который будет содержать в себе обе иконки. И уже этот .ico-файл пропишите в ресурсах.
С уважением, Portnov.
Ответ отправлен: 12.01.2004, 17:43
Отправитель: Portnov
Отвечает Gibbel
Здравствуйте, Alex!
Тебе надо делать один ресурс иконки, содержащий в себе иконки обоих размеров.
Ответ отправлен: 12.01.2004, 10:36
Отправитель: Gibbel
Вопрос № 4793 |
господа эксперты! забудте про мой предыдущий вопрос! сам разобрался. Это просто я - дятел, сначала с мышой работал, а потом видеорежим ставил. и отсюда вопрос:
а разве не пофиг, что и когда ставить?
Вопрос отправлен: 11.01.2004, 23:03
Отправитель: DOS_Forever
[Следующий вопрос >>] [Список вопросов]
Отвечает Евгений Иванов
Добрый день, DOS_Forever!
очень важно
* EMan: -=- Любовь существует! =-=
Ответ отправлен: 12.01.2004, 13:34
Отправитель: Евгений Иванов
Вопрос № 4795 |
Я не так давно задавал вопрос о паролях в Ворде, впринципе все ответы, за которые я благодарен, сводились к тому что всё таки без брутфорса не обойтись. Я попытался использовать какую то софтину от Элком Софт и она вычисляет уже почти сутки пароль из двух символов -а мож есть что-нить побыстрее (машина селерон 2 Mhz)???
Вопрос отправлен: 12.01.2004, 13:24
Отправитель: rams (rams@belovo.net.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Portnov
Доброе время суток, rams!
Два символа сутки - долговато... Я уже упоминал Advanced Office Password Recovery (лежит вроде на passwords.ru), она позволяет задавать диапазон символов либо подбор по словарю - это может оказаться в 100-1000 раз быстрее. В вашем случае так долго по всей видимости от того, что программа подбирает по всем 256 символам, в то время как можно подбирать только буквы и цифры (ну, знаки препинания).
С уважением, Portnov.
Ответ отправлен: 12.01.2004, 18:15
Отправитель: Portnov
Отвечает Bob Johnson
Доброе время суток, rams!
Пароль из двух символов столько времени вычислять просто невозможно. Проверь параметры этой программы (ты, скорее всего, поставил ей минимальное количество символов - 6 или что-то такое - вот она и парится). Из двух же символов можно придумать не более 65536 вариантов (реально - раза в два меньше).
* EMan1.5: ---===*** The game we play ***===---
Ответ отправлен: 14.01.2004, 00:40
Отправитель: Bob Johnson
Вопрос № 4796 |
Здравствуйте уважаемые эксперты.
У меня вопрос не потеме, но может
кто знает: как в си, если мне нужна лишь одна
функция из библиотеки ее выдернуть.
Это нужно мне для того, чтобы уменьшить
объем экзешника. И еще один вопрос где можно
почитать о том как уменьшать объем экзешника.
Вопрос отправлен: 12.01.2004, 15:11
Отправитель: Петя
[Следующий вопрос >>] [Список вопросов]
Отвечает never_again
Доброе время суток, Петя!
>>как уменьшать объем экзешника.
1) пиши код покороче и данных используй поменьше...
2) пиши на ассемблере. точно меньше сишного ехе'шника будет.
Ответ отправлен: 12.01.2004, 18:57
Отправитель: never_again
Отвечает _vt
Доброе время суток, Петя!
На английском - www.catch22.org.uk - есть ответы на оба вопроса. На русском - у Боба Джонсона что-то было по второму.
--- E-Man 1.5+ : Life begins at 1000 MHz!
Ответ отправлен: 13.01.2004, 01:27
Отправитель: _vt
Отвечает Евгений Иванов
Доброе время суток, Петя!
используй библиотекаря
lib
или
tlib
А ещё есть TDUMP.
Удачи!
* EMan: -=- Любовь существует! =-=
Ответ отправлен: 13.01.2004, 01:07
Отправитель: Евгений Иванов
Отвечает Portnov
Добрый день, Петя!
Зависит от того, в каком виде библиотека. Если это Dll, то можно просто динамически линковать эту функцию (LoadLibrary...). Но тогда нужно будет к проге прикладывать Dll. Если у вас GNU C, или другой компилятор с открытыми исходниками, выдерите нужную функцию прямо из исходника. Если библиотека LIB или Dll (но не хочется ее таскать с собой), то видимо придется ее дизассемблировать (IDA) и искать там нужную функцию.
С уважением, Portnov.
Ответ отправлен: 12.01.2004, 18:34
Отправитель: Portnov
Отвечает Bob Johnson
Приветствую Вас, Петя!
На VC под винды - у меня на странице.
Выдернуть функцию - руками, т.к. С++ этого не поддерживает.
* EMan1.5: ---===*** The game we play ***===---
Ответ отправлен: 14.01.2004, 00:41
Отправитель: Bob Johnson
Вопрос № 4797 |
Спасибо всем ответившим. Самое интересное то, что все три эксперта ответили одинаково :-)). У меня тоже была такая мысль, но проблема в том, что комп я покупал с немецкой виндой (Home edition). Соответственно и диск на немише (мать его за ногу). Потом одолжил у знакомого диск с русской версией "профессионала" и установил его на свой комп. Щас этот знакомый уехал в за бугор и увез этот диск с собой так и не скопировав его для меня. Не известно, когда он вернется и вернется ли вообще. Других знакомых с такой версией виндоуза у меня больше нет:-((. Может все-таки есть альтернативные методы господа? Как-то не хочется отваливать столькуо бабла за инсталяцию. Сразу скажу виндоуз у меня легальный и подлежит апдейту:-)) Заранее благодарю Вас всех
Вопрос отправлен: 12.01.2004, 17:13
Отправитель: Murzika
[Следующий вопрос >>] [Список вопросов]
Отвечает never_again
Приветствую Вас, Murzika!
>>Может все-таки есть альтернативные методы господа?
Ja! Du mussen studieren Deutsch!
>>Сразу скажу виндоуз у меня легальный и подлежит апдейту
А он не может быть не легальным. Ведь первую копию кто-то купил... :))
Ответ отправлен: 12.01.2004, 18:50
Отправитель: never_again
Вопрос № 4799 |
Зрасте. Есть такая штучка как файл BGI.
Хотелось бы этой штучке зелезть под юбку и хорошенько пошарить там руками и не только... Я всё ещё о BGI! ;) Так вот, как можно эту штучку раздеть догола и погладеть из чего она сделана?
Вопрос отправлен: 12.01.2004, 19:09
Отправитель: Оза Боченный
[Следующий вопрос >>] [Список вопросов]
Отвечает _vt
Доброе время суток, Оза Боченный!
Лично у меня есть такая дока "The BGI Driver Toolkit: Creating Device Drivers for the Borland Graphics Interface", Copyright (c) 1988,89 Borland International, Revision 1, May 15, 1989. Если не найдешь в сети - пиши, вышлю.
--- E-Man 1.5+ : Life begins at 1000 MHz!
Ответ отправлен: 13.01.2004, 01:27
Отправитель: _vt
Отвечает Artemy
Здравствуйте, Оза Боченный!
Смотри HIEW-ом.
Ответ отправлен: 13.01.2004, 09:35
Отправитель: Artemy
Вопрос № 4802 |
>"резидентный сторож"
(при удалении какого-то файла с дискеты - востанавливать его.)
Спасибо izLesa и Artemy, интересные идеи!
Если не в тягость - гляньте на код.
Я резидента вешаю, а вот зпустить command.com (или вообще любую другую прогамму) и передать параметры - не выходит :[
Пробовал узнать имя даляемого файла (по идеи - dx) - не катит
P.S.
Сторож файлов на дискете.
С надеждой, Юzверь
Приложение:
Вопрос отправлен: 12.01.2004, 21:30
Отправитель: Denis (mikelangello@ukr.net)
[Следующий вопрос >>] [Список вопросов]
Отвечает Artemy
Доброе время суток, Denis!
Да... что-то типа этого я и имел ввиду, только сохранять желательно все регистры, которые ты разрушаешь.
И ещё... зачем тебе запускать command.com? Просто создавай новый файл, открой удаляемый, читай из него и копируй в новый.
Вызывай не int 21h, а используй.
pushf
call СтарыйАдресПрерывания
Ответ отправлен: 13.01.2004, 09:52
Отправитель: Artemy
Вопрос № 4803 |
Здравствуйте уважаемые All!
Я только недавно начал заниматься программированием на ассемблере и нашёл Internet-е книгу «Ассемблер? Это просто! Учимся программировать под MS-DOS» (Редакция 1.16 от 02 ноября 2001 года).
Я надеюсь, что ещё осуществляется поддержка этого проекта и будет кому ответите на моё письмо.
Для изучения материала, изложенного в этой книге, я использую следующее программное обеспечение:
1. Текстовый редактор DOS Navigator’а
2. Ассемблер Turbo Assembler Version 4.1
3. Компоновщик Turbo Link Version 7.1.30.1
4. Отладчик AFD-Pro Version 1.00
5. Дизассемблер IDA PRO Advanced 4.04
Мне не совсем понятно следующее:
Я пишу программу «Hello world!» (PROG01.ASM). Компилирую её в PROG01.COM и запускаю под отладчиком и вижу там следующую информацию:
0100 B409 MOV AH,09
0102 BA0901 MOV DX,0109
0105 CD21 INT 21
0107 CD20 INT 20
Этот участок кода соответствует содержимому ASM-файла и принцип его работы мне понятен, а вот далее идут строки:
0109 48 DEC AX
010A 65 DB 65
010B 6C INSB
010C 6C INSB
010D 6F OUTSW
010E 2C20 SUB AL,20
0110 776F JA 0181
0112 726C JC 0180
0114 64 DB 64
0115 2124 AND [SI],SP
0117 0000 ADD [BX+SI],AL – и эта строка прописана в каждом последующем адресе.
Откуда взялись эти строки в COM-файле?
Если это так видоизменилась строка:
Message db 'Hello, world!$'
из ASM-файла, тогда как можно ёе получить обратно из вышеизложенного текста?
Или это вообще что-то другое, что-нибудь типа обязательных строк, которые образуются при компилировании файла? В таком случае, что стало со строкой:
Message db 'Hello, world!$'?
Где она прописалась в COM-файле или какой вид приняла?
В общем, программа работает, а как мне не до конца понятно…
Я пытался дизассемблировать COM-файл, но это дало мне только то, что я получил шестнадцатеричный код каждого символа в словах «Hello, world!». Но это мне ничего не объяснило…
Ещё мне непонятна работа самого отладчика.
Если просматривать строки при помощи «стрелок» (курсорных клавиш), то количество осмысленных строк на экране ограниченно и поддаётся описанию. А если нажимать клавишу «F1», тогда курсор, дойдя до строки:
0105 CD21 INT 21
вместо положенного перехода к строке:
0107 CD20 INT 20
и выхода из программы, меняет значение, записанное по этому адресу на:
107С 90 NOP
После этого, если нажимать клавишу «F1», курсор начинает прыгать уже на совсем непонятные адреса и вызывать различные команды процессора, о которых даже ещё не было речи. И так можно продолжать до бесконечности…
Мне казалось, что строка:
0107 CD20 INT 20
в COM-файле соответствует строке:
int 20h
в ASM-файле, которая вызывает 21-е прерывание (выход в DOS). Дойдя до этой строки отладчик, по идее, должен был остановить выполнение программы, как это происходит, например, в QBasic-е, когда в тексте программы встречается оператор END. Если бы AFD-Pro работал точно также, тогда всё было бы понятно, а подобный механизм работы мне непонятен.
Также при просмотре строк программы «стрелками» происходят непонятные вещи:
При запуске программы под отладчиком в первых, двух строках я вижу следующее:
0100 B409 MOV AH,09
0102 BA0901 MOV DX,0109
Затем я три раза нажимаю «стрелку - вниз» (клавиша «DOWN»), подсвечивая тем самым строку:
0107 CD20 INT 20
После этого я поднимаю курсор на две строки вверх, а там вместо двух строк:
0100 B409 MOV AH,09
0102 BA0901 MOV DX,0109
я вижу одну строку такого вида:
0103 0901 OR [BX+DI],AX
Почему так происходит? Это вообще нормально или так не должно быть?
Если нормально, то не могли бы Вы объяснить мне почему так происходит. Или поподробнее рассказать о механизме работы отладчика, или подсказать, где можно достать информацию по данному вопросу?
Если так быть не должно, то подскажите, как мне избавиться от данной проблемы?
Возможно у меня что-то не то с настройками, или может необходимо указать какой-нибудь дополнительный строковый параметр в командной строке при компиляции ASM-файла, или при запуске COM-файла под отладчиком?
Ещё меня интересует, есть ли в отладчике какая-нибудь команда для просмотра экрана вывода программы? Аналог клавиши «F4» (Output Screen) в QBasic-е. На мой взгляд – это очень удобная функция и плохо, если в отладчике AFD-Pro нет ничего похожего.
Если такая функция есть в AFD-Pro то, как её вызвать?
Если нет, тогда подскажите, какой отладчик поддерживает нечто подобное, и вообще нужно ли что-нибудь подобное при написании программ на ассемблере?
Заранее большое спасибо. С важением, Сергей.
Вопрос отправлен: 12.01.2004, 23:33
Отправитель: Сергей
[Следующий вопрос >>] [Список вопросов]
Отвечает _vt
Приветствую Вас, Сергей!
> Если это так видоизменилась строка: Message db 'Hello, world!$' из ASM-файла, тогда как можно ёе получить обратно из вышеизложенного текста?
Да, это она. Чтобы посмотреть ее в текстовом виде, можно использовать окошко внизу отладчика AFDPro-переключитесь в него клавишей F7 и введите начальный адрес-в этом случае DS:0109-справа увидите свою строку.
> 0117 0000 ADD [BX+SI],AL - и эта строка прописана в каждом последующем адресе.
Ну так дальше память забита нулями, а отладчик интерпретирует их как команды процессора и выводит их в виде мнемоник ассемблера, тоже самое он делает и с вашей строкой - ведь код и данные, те же числа, просто в зависимости от условий, они могут быть и тем и тем.
> но это дало мне только то, что я получил шестнадцатеричный код каждого символа в словах "Hello, world!"
Так ведь и отладчик вывел вам эти коды! Присмотритесь!
> А если нажимать клавишу F1, тогда курсор, дойдя до строки: 0105 CD21 INT 21 вместо положенного перехода к строке: 0107 CD20 INT 20 и выхода из программы, меняет значение, записанное по этому адресу на: 107С 90 NOP
Так нажимайте клавишу F2! Нажимая F1, вы заходите внутрь обработчика прерывания int21h и можете в нем очень долго "блуждать".
> Дойдя до этой строки отладчик, по идее, должен был остановить выполнение программы
Да, нажимайте F2.
> При запуске программы под отладчиком в первых, двух строках я вижу следующее: 0100 B409 MOV AH,09 0102 BA0901 MOV DX,0109 Затем я три раза нажимаю «стрелку - вниз» (клавиша «DOWN»), подсвечивая тем самым строку: 0107 CD20 INT 20 После этого я поднимаю курсор на две строки вверх, а там вместо двух строк: 0100 B409 MOV AH,09 0102 BA0901 MOV DX,0109 я вижу одну строку такого вида: 0103 0901 OR [BX+DI],AX Почему так происходит? Это вообще нормально или так не должно быть?
Ну, представьте себе - загрузилась в память программа. Она представлена в виде шестнадцатиричных чисел. В вашем случае они все выводятся - B4,09,BA,09,01,01,07 и т.д. При загрузке com-программы процессор начинает выполнять команды с адреса 0100h, а команды представлены не всегда одним числом, а по большей части несколькими. Так вот, числа BA,09,01 обозначают инструкцию mov dx,0109, а если в отладчике переместить указатель не на адрес 0102, откуда начинается эта последовательность, а на адрес 0103, то он представит в виде инструкции последовательность 09,01,01, что является командой or [bx+di], ax. Т.е. это так и должно быть, главное, чтобы выполнялся код программы в правильной последовательности, а отладчиком любые значения ячеек памяти можно представить и как числа, и как строки, и как инструкции процессора.
> Ещё меня интересует, есть ли в отладчике какая-нибудь команда для просмотра экрана вывода программы? Аналог клавиши «F4» (Output Screen) в QBasic-е. На мой взгляд - это очень удобная функция и плохо, если в отладчике AFD-Pro нет ничего похожего
Раз у вас есть пакет Turbo Assembler, то в его составе идет более мощный отладчик - Turbo Debugger, в котором эта функция точно есть.
Напоследок хочу сказать, читайте внимательней книгу Олега Калашникова, там все очень подробно расписано. Ну если будут еще вопросы - обращайтесь!
--- E-Man 1.5+ : Life begins at 1000 MHz!
Ответ отправлен: 13.01.2004, 01:27
Отправитель: _vt
Отвечает VOVAN
Доброе время суток, Сергей!
А если нажимать клавишу «F1», тогда курсор, дойдя до строки:
0105 CD21 INT 21
вместо положенного перехода к строке:
0107 CD20 INT 20
и выхода из программы, меняет значение, записанное по этому адресу на:
107С 90 NOP
После этого, если нажимать клавишу «F1», курсор начинает прыгать уже на совсем непонятные адреса и вызывать различные команды процессора, о которых даже ещё не было речи. И так можно продолжать до бесконечности…
ДЕЛО В ТОМ, ЧТО В ADF НАЖИМАЯ F1 ТЫ ВХОДИШЬ В ОБРАБОТЧИК ПРЕРЫВАНИЯ. ЧТОБЫ ТУДА НЕ ВХОДИТЬ, НАЖИМАЙ F2.
После этого я поднимаю курсор на две строки вверх, а там вместо двух строк:
0100 B409 MOV AH,09
0102 BA0901 MOV DX,0109
я вижу одну строку такого вида:
0103 0901 OR [BX+DI],AX
Почему так происходит? Это вообще нормально или так не должно быть?
Если нормально, то не могли бы Вы объяснить мне почему так происходит. Или поподробнее рассказать о механизме работы отладчика, или подсказать, где можно достать информацию по данному вопросу?
СКАЧАЙ АРХИВ РАССЫЛКИ "Ассемблер? Это просто!" В ВЫПУСКЕ №16 ПОДРОБНО РАСКАЗЫВАЕТСЯ ПРО ПРИНЦИП РАБОТЫ ОТЛАДЧИКА, И ПРО ТО, ПОЧЕМУ ОН ЗАМЕНЯЕТ СТРОКИ НА КАКУЮ-ТО ФИГНЮ.
Ответ отправлен: 13.01.2004, 19:50
Отправитель: VOVAN
Отвечает Евгений Иванов
Доброе время суток, Сергей!
Есть мощный отладчик INSIGHT, есть TD.
А код после int 20h - это и есть та самая строка. ;-)
Бывай.
* EMan: -=- Любовь существует! =-=
Ответ отправлен: 13.01.2004, 01:12
Отправитель: Евгений Иванов
Отвечает Ayl
Доброе время суток, Сергей!
1. Отладчик (как, собственно, и сам процессор) не в состоянии отличить команды от данных (чисел, текстовых строк и т.п.). Поэтому он интерпретирует все как команды и отображает соответсвующим образом.
2. Участок кода, начиная с адреса 109 до адреса 116 соответствует твоей строке \'Hello, World!$\'. Если ты посмотришь на эту строчку в 16-ричном редакторе (в том же DN) то как раз и увидешь теже коды символов, что и в отладчике.
3. Отладчик AFD Pro позволяет трассировать обработчики прерываний. Соответсвенно, когда ты нажимаешь F1 на команде int 21h, то переходишь на первую команду обработчика этого прерывания.
4. То же самое относится и к команде int 20h. Если ты выполнишь трассировку без перехода к подпрограмме (не помню клавиш отладчика, но точно она должна быть), тогда программа завершится.
5. При обратной прокрутке отладчики действительно иногда показывают чушь, видимо из-за невозможности корректного восстановления команды с конца. С этим нужно смириться.
6. Отображение окна вывода должно обязательно быть. К сожалению, т.к. я давно не пользуюсь AFD Pro, то и не помню, какая клавиша за это отвечает.
7. Насчет того, какие еще есть приличные отладчики, то для работы с программами под ДОС я бы рекомендовал Turbo Debugger фирмы Borland. Очень удобный интерфейс и корректная работа с отлаживаемой программой (в частности, защита от попыток блокировки отладчика путем блокирования контроллера прерываний и т.п.).
Ответ отправлен: 13.01.2004, 16:55
Отправитель: Ayl
Отвечает SedHg
Приветствую Вас, Сергей!
Честно говоря, чтобы ответить на все твои вопросы необходимо написать приличную статью, страниц, этак, на 10 -15. Так как такой возможности у нас нет, объясню, то что
наиболее важно.
>В таком случае, что стало со строкой:
>Message db 'Hello, world!$'?
>Где она прописалась в COM-файле или какой вид приняла
Она превратилась в последовательность нулей и единиц =).
================================================
>Я пытался дизассемблировать COM-файл, но это дало мне только то,что я получил шестнадцатеричный код
>каждого символа в словах «Hello, world!».
Это, каким образом у тебя получилось? Дизассемблер на это не способен.
Быть может, ты имел в виду шестнадцатеричный редактор.
===============================================
>Дойдя до этой строки отладчик, по идее, должен был остановить
>выполнение программы, как это происходит, например, в QBasic-е,
>когда в тексте программы встречается оператор END.
Пойми, мы, ведь, вызываем ДОСовскую функцию, вот в её тело мы и попадаем.
Ну насчет васика, могу сказать следующее, программа на васике запускается внутри той программы где создана, поэтому все хлопоты по выполнению кода берет на себя интерпретатор. Честно говоря, уже столько лет ни чего не делал на QBasic'е, что не помню, как он даже выглядит ;).
NB: Не путай синтаксис высокоуровневых языков и команды Асма.
Кстати, TurboDebuger не залезает внутрь ДОСовских функций(читай прерываний), а работает только с кодом загруженной в него проги. Поэтому, выкини свой AFDpro, используй td.
=================================================
>...а вот далее идут строки:
>0109 48 DEC AX
>010A 65 DB 65
>...
>...
>0117 0000 ADD [BX+SI],AL – и эта строка прописана в каждом последующем адресе.
>Откуда взялись эти строки в COM-файле?
Этих строк в com-файле нет, для того чтобы убедится в этом достаточно посмотреть прогу в HEX-редакторе:
B409 BA09 01CD 21CD 2048 656C 6C6F 2C20 776F 726C 6421 24
– это HEX эквивалент нашей проги.
......!. Hello, world!$ - это в виде ASCII.
Отладчик показывает, что находится в памяти, а не в файле.
==================================================
PS: а вообще-то, ты молодец, если тебя интересуют такие подробности, значит, быть тебе
ассемблерщиком ;).
PPS: Если чего-то непонятно, или требуется более подробное объяснение, пиши мне, отвечу.
Ответ отправлен: 15.01.2004, 16:30
Отправитель: SedHg
Вопрос № 4804 |
Здравствуйте!
У меня есть программа на C++Builder (Win9X), где есть функция, выполненная в виде ассемблерной вставки. Теперь я занимаюсь оптимизацией этой самой функции. Так вот отсюда ворос, а как оценить, время выполнения того или иного участка кода? Привожу конкретный пример.
Есть некоторая структура:
struct Complex {
double Re;
double Im;
};
Есть две переменные данного типа, значения которых необходимо обменять местами:
Complex a, b;
Я додумался до трех вариантов решения данной задачи.
1. Объявить временную переменную, далее, при помощи команд работы со строками, просто копировать байты (слова, дв. слова) из одной переменной во временную и т. д., т. е. так, как это происходит в высокоуровневых языках.
2. Использовать системный стек: записать значения переменных в стек, а затем вытащить в нужно порядке. Получится что-то типа:
push dword ptr [a.Re + 4]
push dword ptr [a.Re + 0]
push dword ptr [a.Im + 4]
push dword ptr [a.Im + 0]
push dword ptr [b.Re + 4]
push dword ptr [b.Re + 0]
push dword ptr [b.Im + 4]
push dword ptr [b.Im + 0]
pop dword ptr [a.Im + 0]
pop dword ptr [a.Im + 4]
pop dword ptr [a.Re + 0]
pop dword ptr [a.Re + 4]
pop dword ptr [b.Im + 0]
pop dword ptr [b.Im + 4]
pop dword ptr [b.Re + 0]
pop dword ptr [b.Re + 4]
3. Использовать стек сопроцессора. Получилось что-то вроде этого:
fld qword ptr [a.Re]
fld qword ptr [a.Im]
fld qword ptr [b.Re]
fld qword ptr [b.Im]
fstp qword ptr [a.Im]
fstp qword ptr [a.Re]
fstp qword ptr [b.Im]
fstp qword ptr [b.Re]
Ну и какой из этих вариантов обладает наибольшим быстродействием? Таких мест еще много. Требуется некий универсальный метод. Для определения времени выполнения функции пробовал использовать функцию Windows GetTickCount(), которая возвращает время работы Windiws в мс, но при таком методе оценки времени работы функции велика погрешность - значения после каждого запуска получаются разные, поэтому не представляется возможным оценить изменение времени выполнения исходного куска текста после некоторых изменений, так как при таких небольших изменениях в исходном коде все ускорение работы функции от оптимизации лежит в пределах погрешности измерений.
С уважением, 3030.
Вопрос отправлен: 12.01.2004, 23:47
Отправитель: 3030
[Следующий вопрос >>] [Список вопросов]
Отвечает vitya
Здравствуйте, 3030!
1. все замеры делайте в release версии, без debug инфо - это хорошо ускоряет и делает замеры более верными.
2. если хотите замерять более точно используйте, например, QueryPerformanceCounter.
3. Сделайте проще - напишете функцию Swap(Complex & a, Complex & b); код в приложении, и забудьте, пусть компилятор думает за вас, как бы это сделать побыстрее.
Приложение:
Ответ отправлен: 13.01.2004, 08:38
Отправитель: vitya
Отвечает never_again
Приветствую Вас, 3030!
А ещё можно XOR'ить:
a xor b
b xor a
a xor b
Кажется невероятным? Думаешь числа не поменяются? смотри на примере!
Имеем: (в двоичной системе)
a = 1010
b = 0101
Делаем:
a xor b (1010 xor 0101) -> a = 1111
b xor a (0101 xor 1111) -> b = 1010
a xor b (1111 xor 1010) -> a = 0101
Получаем:
a = 0101
b = 1010
Ответ отправлен: 13.01.2004, 12:31
Отправитель: never_again
Отвечает Евгений Иванов
Добрый день, 3030!
Есть регистры процессора.
Читай их с помощью
RDTSC.
Удачи.
* EMan: -=- Любовь существует! =-=
Ответ отправлен: 13.01.2004, 01:13
Отправитель: Евгений Иванов
Отвечает _vt
Здравствуйте, 3030!
Существует класс программ - профайлеры, специально для измерения скорости... Вот и действуй.
--- E-Man 1.5+ : Life begins at 1000 MHz!
Ответ отправлен: 13.01.2004, 01:27
Отправитель: _vt
Отвечает Bob Johnson
Доброе время суток, 3030!
1. Используй rdtsc, она возвращает время в тактах процессора.
2. Использовать стек или временную память - несколько неоптимально.
Сопроцессор - это действительно хорошее решение. Вообще же обычно делают так:
mov eax, [...1]
mov edx, [...2]
mov [...3], eax
mov [...4], edx
И т.д.
* EMan1.5: ---===*** The game we play ***===---
Ответ отправлен: 14.01.2004, 00:41
Отправитель: Bob Johnson
Форма отправки вопроса |
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.
(C) 2002-2003 Команда RusFAQ.ru.
Вопрос и дополнение |
Ваш вопрос:
Приложение (если необходимо):
Получить ответов:
Выбор рассылки |
Программисту Assembler (24) C / C++ (17) Perl (4) Builder / Delphi (18) Pascal (19) Basic / VBA (5) Java / JavaScript (5) PHP (13) Криптография (5) WinAPI (12) |
Пользователю Windows 95/98/Me (40) Windows NT/2000/XP (58) "Железо" (30) Поиск информации (20) |
Администратору Windows NT/2000/XP (28) Linux / Unix (10) |
Юристу Гражданское право (13) Семейное право (10) Трудовое право (11) КоАП (10) |
Отправить вопрос всем экспертам выбранной рассылки.
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||