Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
RusFAQ.ru: программирование на языке Assembler
Информационный Канал Subscribe.Ru |
RusFAQ.ru: программирование на языке Assembler
Выпуск № 487
от 06.02.2003, 23:10
Администратор: Имя: Калашников О.А. URL: Информационный ресурс ICQ: 68951340 Россия, Москва |
О рассылке: Задано вопросов: 2606 Отправлено ответов: 7849 Активность: 301.1 %
|
Список экспертов, ответы которых опубликованы в данном выпуске |
baldr Статус: Профессиональный Общий рейтинг: 113.6 URL: Сайт об ОС DOS. Всем, кто любит эту ОС! [Подробней >>] |
Maverick Статус: Профессиональный Общий рейтинг: 139.35 URL: Задачи по ассемблеру Телефон: 89039415024 (BeeLine GSM) [Подробней >>] |
Ayl Статус: Профессиональный Общий рейтинг: 118.4 [Подробней >>] |
Bob Johnson Статус: Профессиональный Общий рейтинг: 151.56 URL: Программирование [Подробней >>] |
Broken Sword Статус: Профессиональный Общий рейтинг: 126.03 URL: моя рассылка по Protected Mode [Подробней >>] |
ASMодей Статус: Профессиональный Общий рейтинг: 117.38 [Подробней >>] |
Igoryk Статус: Профессиональный Общий рейтинг: 140.15 URL: IgorykSoft [Подробней >>] |
DiGiT[old] Статус: Профессиональный Общий рейтинг: 109.79 [Подробней >>] |
masquer Статус: Профессиональный Общий рейтинг: 145.39 [Подробней >>] |
Топор Статус: Доверительный Общий рейтинг: 111.73 [Подробней >>] |
Gibbel Статус: Профессиональный Общий рейтинг: 108.19 URL: Страничка обо мне и моих друзьях Телефон: +7 902 168 02 65 [Подробней >>] |
Portnov Статус: Профессиональный Общий рейтинг: 113.63 URL: Мой сайтик... [Подробней >>] |
Joy Статус: Начальный Общий рейтинг: 120.75 [Подробней >>] |
Илья Статус: Доверительный Общий рейтинг: 108.18 [Подробней >>] |
Краткий перечень вопросов |
Вопрос № 2553. Доброе время суток, глубокоуважаемые эксперты! Спасибо за помощь с той дурацкой программкой - но у м... (ответов: 3)
Вопрос № 2554. Здравствуйте, тов. эксперты. Как то при сдаче сессии дали задание, написать программу на асм-ре, ко... (ответов: 6)
Вопрос № 2556. Товарищи! Такая проблема. Дело в том, что Я добавляю в exe-шник ещё одну секцию. Через dumpbin посмо... (ответов: 1)
Вопрос № 2557. Здравствуйте уважаемые Эксперты. Вопрос совсем простой, скорее, кхм, консультация. На днях знакомый ... (ответов: 2)
Вопрос № 2558. Здравствуйте, уважаемые тов. Эксперты! У меня к вам такой вопрос: Я написал программу, которая вывод... (ответов: 2)
Вопрос № 2559. Здравствуйте, Эксперты!!! Я хотел бы узнать, как можно произвести запись в загрузочный диск и каким ... (ответов: 1)
Вопрос № 2561. Здравствуйте, эксперты! У меня два вопроса по алгоритмам чисел. Очень простых, я думаю "из учеб... (ответов: 3)
Вопрос № 2562. Здравствуйте уважемые эксперты, помогите пожалуйста найти ошибку. Высылаю Вам часть кода, который не... (ответов: 8)
Вопросов: 8, ответов: 26
Вопрос № 2553 |
Доброе время суток, глубокоуважаемые эксперты!
Спасибо за помощь с той дурацкой программкой - но у меня по-прежнему мало что выходит. Недавно спрашивала нужен ли masm - похоже я не умею правильно работать с tasm - приходиться после каждого ассемлирования перегружаться и так раз 30-40 в день.
А с той прогой у меня выходит красота - комп виснет, подмигивает и.т.п.Я решила для начала упростить себе задачу - после каждого цикла выводить - match or not match...
Но нужно сделать то, что в задании
Еще кое-что
Если кому-то нужно я нашла довольно много исходников, которые могли бы помощь начинающим и.т.п.
могу выслать на мыло (ссылку не помню)
Приложение:
Вопрос отправлен: 01.02.2003, 21:42
Отправитель: Ольга (galateya2003@yahoo.com)
[Следующий вопрос >>] [Список вопросов]
Отвечает baldr
Доброе время суток, Ольга!
Ну, во-первых, если Вы хотите вывести содержимое stroka с помощью Int21h/9h, то надо в конце
добавить "$". Иначе выведется еще и строка failed, что, как я понимаю, нежелательно...
counter неплохо бы обнулять перед каждым новым поиском...
В первом варианте перед jmp rt надо проверять counter на ноль - если не ноль - значит входит,
иначе - не входит и разные варианты вывода...
А вообще бесконечный цикл сделан правильно... :)))... Только для интереса надо еще
cli постави... СТОЙ! Не ставь! я пошутил! :)))
Второй вариант отличается от первого тем, что быстрей зависнет... :) Потому что нет вывода
на экран... :)
В общем, для того, чтобы не висло, надо cx проверять на ноль - если ноль - то выход из программы.
Сама логика проверки и подсчета, кажется, правильная, но я не проверял...
Ответ отправлен: 03.02.2003, 00:41
Отправитель: baldr
Отвечает Maverick
Приветствую Вас, Ольга!
Если еще не написала програмку свою, то мыльни мне конкретные условия для нее, накодим чтонить :)
Maverick@nightmail.ru
Ответ отправлен: 03.02.2003, 08:32
Отправитель: Maverick
Отвечает Ayl
Приветствую Вас, Ольга!
Ну так что же ты, дорогая, хотела-то! И MASM тебе не поможет. Если программа зациклена - ей ни один компилятор не поможет!
Вот смотри. У тебя выход должен происходить с метки exit. Но на эту метку никакого перехода нет. И просто так ты туда не попадаешь, потому что перед ней стоит безусловный переход.
Далее. Ты пытаешься выполнить сравнение с помощью команды cmpsb. Все бы хорошо, но это команда сравнения дух строк. Одна адресуется с помощью ds:si, вторая - es:di. Ни si, ни di ты не настраиваешь, т.е. проверяешь совсем не то, что нужно. К тому же тебе вообще не нужно сравнение строк, а нужно сканирование строки. А это выполняется с помощью команды scasb.
Теперь по поводу алгоритма. Вот ты берешь первый символ. Считаешь его вхождение в строку. Предположим, что всего 3 раза. Далее, берешь следующий символ, делаешь тоже самое и т.д. Рано или поздно, ты дойдешь до второго вхождения самого первого символа. И снова будешь считать вхождения. Но теперь их будет только 2. Потом - 1. Т.е. ты несколько раз будешь вычислять вхождение одного и того же символа. Кажется, это немного не то, что в задании?
Как бы я это сделал - я тебе уже писал. Повторю еще раз. Заведи массив счетчиков, по одному на каждую букву алфавита. Всего - 26. Вначале они все равны 0. Теперь, сканируя строку, увеличиваешь соответствующий счетчик на 1. Потом все ненулевые счетчики выводишь на экран.
Кстати, для избежания вот таких ошибок зацикливания и связанных с этим перезагрузок пользуйся отладчиками. Например, Turbo Debbuger.
Приложение:
Ответ отправлен: 05.02.2003, 12:41
Отправитель: Ayl
Вопрос № 2554 |
Здравствуйте, тов. эксперты.
Как то при сдаче сессии дали задание, написать программу на асм-ре, которая сохраняла бы данные введенные с клавы в текстовом файле. Увы, познания в асме практически 0, и времени было около недели(т.к. заочно). В результате родился некий работающий,но убогий код(в приложении). Ближе к теме - можно ли записать структуру peoples в файл сразу, а не поэлементно?
Заранее спасибо...
Приложение:
Вопрос отправлен: 02.02.2003, 02:41
Отправитель: Avator (president2000@pisem.net)
[Следующий вопрос >>] [Список вопросов]
Отвечает Bob Johnson
Приветствую Вас, Avator!
Можно:
mov cx, size peoples
mov bx, [fl_hndl]
mov dx, offset sotr
mov ah, 40h
int 21h
Ответ отправлен: 02.02.2003, 19:09
Отправитель: Bob Johnson
Отвечает Broken Sword
Здравствуйте, Avator!
о боже, какой придурок додумался до того, чтобы такое чисто сишное (или паскалевское) задание заставить реализовывать на асме... ну а о реализации я вообще лучше промолчу :)
ближе к теме - можно, для этого нужно оффсет peoples загнать в dx, а в качестве размера (cx) указать размер этой структуры - 110 байт. (это все конечно к 40h функции 21h прерывания)
Ответ отправлен: 02.02.2003, 03:30
Отправитель: Broken Sword
Отвечает ASMодей
Добрый день, Avator!
Если бы у тебя строки были фиксированной длины, то тогда
можно было бы записать структуру people целиком. А если
попытаться это сделать сейчас, то после строк окажутся
записанными лишние символы.
Ответ отправлен: 02.02.2003, 12:26
Отправитель: ASMодей
Отвечает Igoryk
Доброе время суток, Avator!
А почему бы и нет. Ты все равно обращаешься как со структурой.
Ответ отправлен: 02.02.2003, 15:03
Отправитель: Igoryk
Отвечает DiGiT[old]
Доброе время суток, Avator!
Да можно. Указываешь рамер этой структуры и начало объекта этой структуры и пишешь :))
Ответ отправлен: 03.02.2003, 02:57
Отправитель: DiGiT[old]
Отвечает Ayl
Приветствую Вас, Avator!
Да, конечно. Для этого тебе нужно после sotr peoples <> написать:
Sotr_Len EQU $ - sotr
что даст тебе размер записи, а потом при выводе в файл устанавливаешь ds:dx на sotr, а в cx записываешь Sotr_Len. Соответственно, в файл будет записана вся структура "как есть".
Ответ отправлен: 05.02.2003, 12:47
Отправитель: Ayl
Вопрос № 2556 |
Товарищи!
Такая проблема.
Дело в том, что Я добавляю в exe-шник ещё одну секцию.
Через dumpbin посмотрел - секция добавилась, но
где-то в заголовках Я подкорректировал, похоже,
не все поля.
Секцию Я добавил с характеристикой: для чтения и всё (насколько это
важно для возможности запуска exe-шника?).
Модифицированный exe-шник должен будет брать данные
из доп. секции, которую Я и пытаюсь добавить.
В связи с этим возникли некоторые вопросы.
IMAGE_NT_HEADERS::OptionalHeader нового exe-шника должен
отличаться от прежнего. Это очевидно.
Подскажите, как правильно изменить и надо ли менять следующие
поля: AddressOfEntryPoint, SizeOfImage, SizeOfHeaders?
Может ещё какие-то поля требуют коррекции?
Надо ли изменять элементы массива DataDirectory?
Очень рассчитываю на то, что у некоторых из Вас есть опыт
добавления/модификации секций.
Заранее спасибо!
Вопрос отправлен: 02.02.2003, 06:35
Отправитель: UE
[Следующий вопрос >>] [Список вопросов]
Отвечает masquer
Здравствуйте, UE!
Для запуска все важно. А корректироваться должны адреса и размеры секции, ну и ImageSize, OEP, насколько я понял тебе не нужно трогать. Изменение еще чего-то зависит от самой секции...
Ответ отправлен: 03.02.2003, 12:59
Отправитель: masquer
Вопрос № 2557 |
Здравствуйте уважаемые Эксперты.
Вопрос совсем простой, скорее, кхм, консультация. На днях знакомый притащил весьма странный экзешник, по виду похож на троян, поскольку прячется по RegisterServiceProcess (присутствует вызов) и активно работает с реестром и сокетами. Кто может сказать конкретно - что это за программка? Выглядит мягко говоря подозрительно. Разумеется, программку вышлю всем желающим, черкайте на dv2000@hotbox.ru кого заинтересовало. А то у меня самого квалификация для этого недостаточная.
С уважением, Дмитрий
Вопрос отправлен: 02.02.2003, 08:26
Отправитель: Дмитрий
[Следующий вопрос >>] [Список вопросов]
Отвечает Bob Johnson
Приветствую Вас, Дмитрий!
Если есть RegisterServiceProcess - то это уже странно. Либо это твой друг решил тебе в подарок шутку какую-нибудь сделать, или действительно троян. Проверь для начала свежим антивирусом.
Ответ отправлен: 02.02.2003, 19:09
Отправитель: Bob Johnson
Отвечает Топор
Приветствую Вас, Дмитрий!
Мыль её мне на axe@63.ru
Ответ отправлен: 04.02.2003, 11:56
Отправитель: Топор
Вопрос № 2558 |
Здравствуйте, уважаемые тов. Эксперты!
У меня к вам такой вопрос:
Я написал программу, которая выводит текст из буфера в EDIT-контрол при помощи SetDlgItemText. Так вот, как в EDIT-контроле перевести курсор на следующую строку? Спасибо.
Вопрос отправлен: 02.02.2003, 10:31
Отправитель: Leo
[Следующий вопрос >>] [Список вопросов]
Отвечает Gibbel
Доброе время суток, Leo!
Во-первых, твой Edit Control должен иметь флаг Multiline. Далее, тебе необходимо закончить текс в контроле кодами 0Dh,0Ah. После этого, чтоб установить курсор в конец текста, посылаешь элементу управления сообщение EM_SETSEL с lParam=wParam=длина текста.
Ответ отправлен: 03.02.2003, 12:43
Отправитель: Gibbel
Отвечает Igoryk
Добрый день, Leo!
Перевести на следующую строку послав коды: 13 и 10 (CRLF). Но для этого нуно послать сообщение, разрещающее перенос Multi...
Ответ отправлен: 02.02.2003, 15:03
Отправитель: Igoryk
Вопрос № 2559 |
Здравствуйте, Эксперты!!!
Я хотел бы узнать, как можно произвести запись в загрузочный диск и каким образом можно произвести расширение этого диска?
Если вы не знаете, то не могли бы вы подсказать, где можно найти информацию такого рода?
Как можно произвести автозапуск программы (например, через 3 минуты после загрузки Windows или Linux)?
Большое спасибо.
С уважением
Приложение:
Вопрос отправлен: 02.02.2003, 13:00
Отправитель: Чёрный Ангел (raven@joker.botik.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Maverick
Приветствую Вас, Чёрный Ангел!
В какой такой загрузочный диск? Может сектор?
Есть доки по загрузочным вирусам, могу дать.
Насчет автозапуска, сверяйся с таймером.
Ответ отправлен: 03.02.2003, 16:30
Отправитель: Maverick
Вопрос № 2561 |
Здравствуйте, эксперты!
У меня два вопроса по алгоритмам чисел. Очень простых, я думаю "из учебника", но с людьми общаться все же как-то приятнее, чем с книгами.
Требуется:
1. Установить бит 1 или 0 по текущему разряду reg32 за наименьшее число операций.
2. Как узнать сколько разрядов занимает целое число.
Спасибо вам за рассылку и ваш нелегкий труд.
Вопрос отправлен: 02.02.2003, 20:11
Отправитель: Евгений Коломеец (codex@nserv.iki.rssi.ru)
[Следующий вопрос >>] [Список вопросов]
Отвечает Igoryk
Добрый день, Евгений Коломеец!
1. Выборочно установить биты ты можешь с помошью команды or.
например
or ax, 11111111b
установит все биты AX в 1.
2. Это понятие для процессора очень условное. Но если ты например хочешь узнать сколько разрадов занимает число 111, то алгоритм такой:
Помещаешь число в переменную или регистр, затем делишь с остатком (idiv) до тех пор, пока частное не станет равно 0. Заодно нужно подсчитывать количество таких делений - это и будет количество разрядов.
Ответ отправлен: 03.02.2003, 14:26
Отправитель: Igoryk
Отвечает Broken Sword
Приветствую Вас, Евгений Коломеец!
1. Команды BTR и BTS, хотя вопрос ты задал криво
2. Ищешь самый старший разряд, который равен единице - его позиция и есть разрядность числа (хотя если число представлено в отрицательном виде, то тогда нужно искать предпоследний старший равный единице бит)
Ответ отправлен: 02.02.2003, 22:08
Отправитель: Broken Sword
Отвечает Portnov
Доброе время суток, Евгений Коломеец!
1. Не понял... В смысле, надо бит в регистре установить в ноль или единицу? Тогда так (примеры для 8-битных, на 32 тоже самое, только числа длиннее)
Устанавливаем третий бит AL в 1:
or al,00001000b
Устанавливаем четвертый бит BL в 0:
and bl,11101111b
2. В общем случае - взять двоичный логарифм этого числа и округлить его до ближайшего бОльшего целого, после чего прибавить 1, только иногда полученное число будет на 1 больше, чем надо, но это обычно не страшно. Так, Log2 9==3,16 -> 4+1==5 - на 1 больше; Log2 8==3 -> 3+1==4 - правильно.
C уважением, Portnov.
Ответ отправлен: 05.02.2003, 11:20
Отправитель: Portnov
Вопрос № 2562 |
Здравствуйте уважемые эксперты,
помогите пожалуйста найти ошибку. Высылаю Вам часть кода, который не хочет работать. Он должен повторить на экране ту же строчку, которую я только что ввёл. Заранее благодарен,
Michel
Приложение:
Вопрос отправлен: 02.02.2003, 23:07
Отправитель: Michel (michaelgul@hotmail.com)
[Следующий вопрос >>] [Список вопросов]
Отвечает ASMодей
Здравствуйте, Michel!
Не понятно, что ты хотел сделать в этих строках:
mov bx,offset Adres_s
mov dx,[bx+2]
достаточно было просто написать
mov dx,offset Adres_s
а если тебе нужен адрес со смещением +2, то пиши так:
mov bx,offset Adres_s
lea dx,[bx+2]
Ответ отправлен: 03.02.2003, 06:25
Отправитель: ASMодей
Отвечает Joy
Приветствую Вас, Michel!
Код написал ты правильный. Вот только у тебя одна ошибка в строке mov dx,[bx+2]. Этой строкой ты хотел, чтобы в dx оказалось смещение твоей строки + 2. А получилось, что ты записываешь слово в регистр DX по смещению BX+2. Короче подправил твой код. см. в приложении.
PS. Пользуйся отладчиком
Приложение:
Ответ отправлен: 03.02.2003, 07:42
Отправитель: Joy
Отвечает Igoryk
Приветствую Вас, Michel!
Вы используете функцию 9 прервания 21H, кторая выводит все символы строки до того как встрети знак $. Так что проблема имеет три решения:
1. Либо вы будете использовать функцию 41h.
2. Вводить строку со знаком $.
3. Добавлять в конец введенно строки знак $.
Ответ отправлен: 03.02.2003, 14:26
Отправитель: Igoryk
Отвечает Bob Johnson
Добрый день, Michel!
Замени mov на lea. Потому что при вызове функции 9 тебе нужно в dx передать
адрес буфера, где находится строка, это на два байта больше, чем начало буфера
для функции 0Ah. А ты считывал первые два байта из буфера как адрес.
Приложение:
Ответ отправлен: 03.02.2003, 18:21
Отправитель: Bob Johnson
Отвечает Илья
Доброе время суток, Michel!
Советую обзавестись хорошим хелпом. Или научится им пользоваться.
mov ah,0Ah
mov dx,offset Adres_s
int 21h ;vvod stroki
Почему здесь используется функция 0ah??? Если вы хотите сделать буферизированный ввод(что и делает данная функция), то надо и буфер подготовить соответственно. У вас буфер не объявлен, а объявлен только его размер:
Adres_s db 50
а надо так:
Adres_s db 50, 50 DUP (?)
Ну, то что было написанно сверху не по существу, но все же.
Далее вывод. Функция 09h выводит строку символов до символа $. А по идее мы его не вводим в строке, и функция будет выводить все из памяти, пока не встретит этот знак. Входные параметры функции тоже не верны. В dx должен быть адрес строки, а bx в данной функции роли не играет. Т.е. по идее, что-бы данный код заработал мы должны ввести:
mov ah,9
mov dx, offset Adres_s + 2
int 21h
.
.
.
ret
Adres_s db 50, 50 DUP ('$') ; тут мы определяем весь буффер знаками $
Но в данном случае у нас создастся иллюзия, что строка не выводится, так как при вводе строки и нажатии в конце ввода клавиши "Enter". Мы переводим курсор в начало строки, и выводим её поверх себя самой.
Скорее всего, Вы хотели выводить строку функцией 40h. Т.к. в функции фигурирует размер введенной строки.
Входные параметры данной функции:
ah - 40h
bx - описатель файла
ds:dx - адрес буфера
cx - кол-во записываемых байт
Так как мы выводим на экран, то в качестве описателя файла будем использовать стандартный описатель устройства вывода - 1
Т.е. код должен получится такой:
mov ah, 40h
mov bx, 1
mov cx, [Adres_s + 1]
mov dx, offset Adres_s + 2
int 21h
.
.
.
ret
Adres_s db 50, 50 DUP (?)
Но опять мы получим иллюзию что строка не выводится.
Этого можно избежать путем принудительного перевода строки после ввода, или добавления 0ah в конец строки (следовательно и увеличения ваводимых символов).
А во всем этом можно было запросто разобраться используя простой отладчик :)
З.Ы. Чуть не забыл, т.к. все смещения для данных функций берутся относительно DS, то его надо тоже определить на сегмент кода т.е. assume cs:CSEG, ds:CSEG
Ответ отправлен: 03.02.2003, 04:39
Отправитель: Илья
Отвечает Maverick
Доброе время суток, Michel!
Ага, а ф-ия 9h выводит символы пока не встретится знак $.
Вот и дописывай в конец строки этот значок, а потом уж и выводи, или выводи с помощью:
lodsb
int 29h
В цикле.
Ответ отправлен: 03.02.2003, 08:57
Отправитель: Maverick
Отвечает Portnov
Доброе время суток, Michel!
Баксом ($) для ф-ции 9 int21h кто за вас строку заканчивать будет!?
Ответ отправлен: 05.02.2003, 11:21
Отправитель: Portnov
Отвечает Ayl
Доброе время суток, Michel!
Ну, все дело в том, что ты неправильно задал буфер для ввода. Надо вот так:
Adres_s db 50
Adres_l db ?
Adres db 50 dup (?)
В результате после вызова функции 0ah прерывания 21h (например, ввели "Привет!") у тебя данные будут выглядеть так:
Adres_s db 50
Adres_l db 7
Adres db 'Привет!', 0dh
Теперь тебе нужно заменить 0dh на знак '$' для правильной работы функции 9:
xor ax, ax
mov al, [Adres_l]
lea bx, Adres
add bx, ax
mov byte ptr [bx], '$'
Ну а теперь можно и вывести строку, находящуюся в Adres.
Ответ отправлен: 05.02.2003, 13:09
Отправитель: Ayl
Форма отправки вопроса |
Форма может работать некорректно в почтовых программах "Microsoft Outlook" и "Microsoft Outlook Express". В программе The Bat! подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте, что в некоторых браузерах могут стоять запреты на открытие других окон, а также "чрезмерное" кэширование данных, при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.
© 2002 Команда RusFAQ.ru.
Вопрос и дополнение |
Ваш вопрос:
Приложение (если необходимо):
Получить ответов:
Выбор рассылки |
Программисту Assembler (37) C / C++ (28) Perl (7) Delphi (18) Pascal (24) Basic / VBA (12) Java / JavaScript (12) PHP (8) MySQL / MSSQL (8) |
Пользователю Windows 95/98/Me (35) Windows NT/2000/XP (29) "Железо" (31) Поиск информации (18) |
Администратору Windows NT/2000/XP (14) Linux / Unix (13) |
Юристу Гражданское право (11) Семейное право (7) Трудовое право (6) КоАП (5) |
Отправить вопрос всем экспертам выбранной рассылки.
© 2002 Россия, Москва. Авторское право: RusFAQ.ru |
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу |
В избранное | ||