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

Ассемблер? Это просто! Учимся программировать (FAQ)


Служба Рассылок Subscribe.Ru проекта Citycat.Ru

Ассемблер? Это просто! Учимся программировать (FAQ)
______________________________________

Выпуск N 040

Вопросы, которые поступили от подписчиков рассылки
"Ассемблер? Это просто! Учимся программировать"

Дата выхода: 2001-07-19


Вопрос №353

Еще раз привет, товарищь эксперт.
Недавно я попытался написать первый резидент. Написал. Он не заработал. Мы с экспертом Александром исправили все ошибки, которые смогли найти, но он (резидент) все равно не заработал.
Поэтому мы просим помощи у тебя, товарищь эксперт.
Как говориться, две головы хорошо, а двадцать семь лучше!
=]
Резидент пытаеться запретить запись на определенный диск.
Пишу первый раз, поэтому просьба не грешить на меня за примитивные ошибки.

Код прилагаеться.

Ответ

Здравствуйте, Stepan Yar!

Во первых привести английскую букву к верхнему регистру можно проще...
and al, 0dfh
Правда предварительно желательно проверить, что это все таки буква...

А в прерывании попробуйте так же перевести букву диска к верхнему регистру... помоему чаще пути пишуться с маленькой...


Отправил эксперт: Dron
Эксперт отправил ответов (всего): 38

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №354

Привет, товарищь эксперт.
Копался в исходнике одного виря, обнаружил в начале такой код:
========================
entry_point:
call get_bp

get_bp:
pop bp
sub bp, offset get_bp
========================
Что будет в регистре bp?
Для чего вообще такая махинация нужна?

З.Ы. Вирь резидентный, стеалс, полимерфик.

Ответ

Здравствуйте, Stepan Yar!

ПРи вызове процедуры в стек запихивается предыдущий ip
В функции он извлекается, и определяет смещение команды, следующей непосредственно за call.
так как вирь видимо не привязан к адресам памяти, ему нужно знать по какому адресу он находится... offset get_bp - это смещение при компиляции.


Отправил эксперт: Dron
Эксперт отправил ответов (всего): 39

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №355

Помогите пожалуйста!!! Как можно изменить код проги *.exe весом в 590 кБ, если IDA создает *.asm из нее длиной в 3,8 мега!!!!
(около 20 000 страниц текста, сами понимаете...) я этот *.asm всеже открыл каким то образом в ворде (грузился минуты 2) и поменял таки строки нужные мне... но вот новая беда: ТАСМ -у не хватает памяти для ассемблирования... Помогите кто чем может!!!!

Ответ

Здравствуйте, George Stobbart!

Используй какие-нибудь HEX editor'ы...

После дизасемблирования проги далеко не всегда корректно собираются лучше так не делать. измени прямо в байтиках...


Отправил эксперт: Dron
Эксперт отправил ответов (всего): 40

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №356

Уважаемые эксперты,

Немогли бы мне объяснить, в чем разница между форматированием низкого уровня и высокого уровня? А также был бы хорошо, если Вы объясните на каком-то примере.
Заранее благодарен,
Рустам

Ответ

Здравствуйте, Rustam!
При форматировании низкого уровня-переразмечаются все дорожкки на физическом уровне, а при высоком стирается только ФАТ


Отправил эксперт: Sensey
Эксперт отправил ответов (всего): 25

Экспертная группа: Модели, виды и типы компьютеров (hard)

Вопрос №356

Уважаемые эксперты,

Немогли бы мне объяснить, в чем разница между форматированием низкого уровня и высокого уровня? А также был бы хорошо, если Вы объясните на каком-то примере.
Заранее благодарен,
Рустам

Ответ

Здравствуйте, Rustam!
При форматировании низкого уровня на дисках винта полностью поновой перерезаются дорожки и если на винте был bad он соответственно будет уничтожен.
При форматировании высокого уровня происходит просто размагничивание уже существующих дорожек в результате вся информация и теряется.


Отправил эксперт: Роман
Эксперт отправил ответов (всего): 8

Экспертная группа: Модели, виды и типы компьютеров (hard)

Вопрос №355

Помогите пожалуйста!!! Как можно изменить код проги *.exe весом в 590 кБ, если IDA создает *.asm из нее длиной в 3,8 мега!!!!
(около 20 000 страниц текста, сами понимаете...) я этот *.asm всеже открыл каким то образом в ворде (грузился минуты 2) и поменял таки строки нужные мне... но вот новая беда: ТАСМ -у не хватает памяти для ассемблирования... Помогите кто чем может!!!!

Ответ

Здравствуйте, George Stobbart!
Дело в том, что в дизассемблированной программе нельзя что-то поменять безнаказанно. Лучше всего записать адресок команды которую нужно поменять, а затем в обычном HEX - редакторе найти то, что расположено по этому адресу и изменить байтики на ту команду которая необходима.


Отправил эксперт: Роман
Эксперт отправил ответов (всего): 9

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №344

Привет, товарищи эксперты.
При попытки апдейта биоса столкнулся с проблемой:
Утилита awdflash.exe пишет ошибку - "Unknown Flash Type!"
Хотя флэш тайп у меня как был так и стоит, я его не трогал с момента покупки компьютера.

Award v4.51PG
580VPX-ITE8661-2A5LDL1CC
DATE: 08/28/97

Ответ

Здравствуйте, Space™!

Вообще-то Flash Type - переводится как
Тип Flash'а.

Вы видимо пытаетесь использовать AWDFLASH 1997 года рождения для
прошивки микросхемки Flash, которую собрали два дня назад. Потому
он и не знает Вашу микросхему! Примите чего поновее (Например,
(c) 2001) и прошивайте туда чего хотите.


Отправил эксперт: Nik
Эксперт отправил ответов (всего): 28

Экспертная группа: Модели, виды и типы компьютеров (hard)

Вопрос №346

Как написать собствееный обработчик аппаратных прерываний под Win'98 -Win'Nt. Каким образом расчитать адрес процедуры обработки прерываний и загрузить его в IDT. Заранее благодарен.

Ответ

Здравствуйте, Nick!

  • Win9x: Пиши свой VxD.
  • WinNT: Пиши свой Kernel-Mode Driver.


    Отправил эксперт: Nik
    Эксперт отправил ответов (всего): 29

    Экспертная группа: Общие вопросы по программированию на Ассемблере под Win32

    Вопрос №349

    Уважаемые эксперты,объясните как перевести монитор в "зеленый" режим ?

    Ответ

    Здравствуйте, Николай!

    Ты имеешь в виду EnergyStar?? Так он и так в нём работает, если он
    его поддерживает.. Это как пластиковая бутылка - её как не плавь,
    она гнить всё равно не будет (без поддержки EnergyStar), а бумага -
    её как не жги (если только её не покрывать всякими-там Pinotex'ами),
    она запростро сгниёт, а потом из неё деревце вырастет, а из него
    бумагу сделают, ну и так далее...

    А "Зелёные" мониторы, они электричество
    экономят и пластмасса, из которой они сделаны, поддаётся переработке
    (из неё потом новый монитор сделают, если ты где-либо, кроме России,
    свой монитор на свалку выкинешь - у нас ещё до сих пор всё это
    валяется где-нибудь за городом и гниёт (точнее, не гниёт)).


    Отправил эксперт: Nik
    Эксперт отправил ответов (всего): 30

    Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

    Вопрос №354

    Привет, товарищь эксперт.
    Копался в исходнике одного виря, обнаружил в начале такой код:
    ========================
    entry_point:
    call get_bp

    get_bp:
    pop bp
    sub bp, offset get_bp
    ========================
    Что будет в регистре bp?
    Для чего вообще такая махинация нужна?

    З.Ы. Вирь резидентный, стеалс, полимерфик.

    Ответ

    Здравствуйте, Stepan Yar!

    последовательность команд


    call @@1
    @@1:

    помещает в стек адрес метки @@1 (Это же CALL!). А команда POP BP её
    извлекает.


    Отправил эксперт: Nik
    Эксперт отправил ответов (всего): 31

    Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

    Вопрос №358

    Добрый день!
    Подскажите как сравнить между собой две переменных?
    Например:
    Word1 db 'abcde$'
    Word2 db 'yxzyx$'
    Word2 поменяла значение, как узнать стала ли она равна Word1?

    Ответ

    Здравствуйте, Fadyk!

    Используй команду CMPSB/CMPSW/CMPSD в
    сочетании с префиксом REP/REPE/REPNE/REPZ/REPNZ.


    Отправил эксперт: Nik
    Эксперт отправил ответов (всего): 33

    Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

    Вопрос №356

    Уважаемые эксперты,

    Немогли бы мне объяснить, в чем разница между форматированием низкого уровня и высокого уровня? А также был бы хорошо, если Вы объясните на каком-то примере.
    Заранее благодарен,
    Рустам

    Ответ

    Здравствуйте, Rustam!

    При форматировании высокого уровня записываются таблицы вроде FAT,
    создаётся корневой каталог и т.д.

    При форматировании низкого уровня на винт прописывается инфа,
    находящаяся между секторами, типа всяких там индексных промежутков
    и т.д.


    Отправил эксперт: Nik
    Эксперт отправил ответов (всего): 34

    Экспертная группа: Модели, виды и типы компьютеров (hard)

    Вопрос №357

    Привет.
    Большое спасибо экспертам, указавшим мне на ошибки в резиденте. Я все исправил. Прога опять не заработала (это уже почти традиция :] )
    Такая фишка получается. Я ради эксперимента попробовал протестировать 21h прерывание после установки нового вектора. И представте себе, оно работает! Значит обработка происходит правильно. А почему тогда происходит зависание?
    Если строка выводиться (а именно так я его и тестировал), значит видимо сбой идет далее. Далее стояла только функция установки TSR. Причем досовская. Я подумал, что наверное Дос не может по какой-то причине заTSRить программу его же и перехватывающую. Поменял на прерывание 27h (кстати, тоже досовское). Перекомпилировал, и опять все в 1001 раз зависло.
    Я уже не знаю в чем причина. Как ни странно, в TD все проходит на ура.
    Очень интересная и одновременно странная ошибка.
    Исходник прилагаеться.

    Эксперт Dron:
    >Во первых привести английскую букву к верхнему регистру можно проще...
    >and al, 0dfh
    А зачем? Я привожу букву к строчному формату, затем к заглавному и сохраняю в TSR-части и то и другое.
    >Правда предварительно желательно проверить, что это все таки буква...
    Даже если б это была не буква прога бы не зависала.

    Эксперт Basfer:
    >Еще надо выделить проге хотя бы на 1 параграф памяти больше: mov dx, (...)/16 + 1.
    Ну вообще то там так и было. Там просто сладывалось не с PSP а с PSP+Fh вот и все.

    Ответ

    Здравствуйте, Stepan Yar!
    Попытайся заменить строку jmp dword ptr old_ip на jmp dword ptr CS:old_ip, потому что в регистре DS(по умолчанию он используется) может быть все, что угодно. И сотри int 20h. int 27h является само прерыванием выхода.

    С уважением, Basfer.


    Отправил эксперт: Basfer
    Эксперт отправил ответов (всего): 8

    Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

    Вопрос №352

    В одной программы (для скорости) мне понадобилось знать, где лежит то слово, в котором ДОС хранит позицию курсора.

    Вопрос 1: По какой формуле можно найти его адрес...

    Вопрос 2: Ну и раз уж я спросил про формулу, то где лежит тот байт, в котором записана текущая страница, (или, может быть, активна та страница, в поле которой курсор?)

    Для того чтоб узнать ответы на данные вопросы, я залез в ДОС? И нашел вместо ответов еще три вопроса?

    Вопрос 3: AfdPro дизассемблировал кусок 21h прерывания так: 36FE060203 INC B/SS:[0302]. Я не въехал, что есть "B/". Вот все остальное понял, а это?

    Вопрос 4: Вот, как одну и туже последовательность байт (из Int 21h) видят:

    Hiew 6.40:

    00000000: 7415 je 000000017
    00000002: C4 ???
    00000003: C442EB les ax,[bp][si][-0015]
    00000006: 389080FC cmp [bx][si][0FC80],dl
    0000000A: F0 lock
    0000000B: C3 retn

    TD:

    cs:0100>7415 je 0117
    cs:0102 C4C4 les ax,sp
    cs:0104 42 inc dx
    cs:0105 EB38 jmp 013F
    cs:0107 90 nop
    cs:0108 80FCF0 cmp ah,F0
    cs:010B C3 ret

    AfdPro:

    0100 7415 JZ 0117
    0102 C4 DB C4
    0103 C442EB LES AX,[BP+SI-15]
    0106 389080FC CMP [FC80+BX+SI],DL
    010A F0 LOCK
    010B C3 RET

    Кто прав? Единственное что везде совпадает это Ret, да и тот я специально поставил, его в прерывании не было J

    Вопрос 5: Почему в Int 10 после команды "C4" в Dx чудодейственным образом попадало положение курсора, да еще в виде X/Y, а не Y*80+X? При этом во всех остальных регистрах ничего похожего не было?

    Ответ

    Здравствуйте, Marmon!
    Не знаю как в ДОС, но в памяти БИОС курсор для первой страницы хранится по адресу:

    0040h:0050h (x)
    0040h:0051h (y)
    ... и так далее для 8 видео страниц
    0040h:005Eh (x - курсора страницы 8)
    0040h:005Fh (y - курсора страницы 8)

    Байт активной страницы тоже находится в сегменте 0040h
    но его смещение ищи сам, по хелпам, или может кто поможет


    Ну и наконец, для того чтобы что-то понять не обязательно везде суваться с дебагером, попробуй почитать полезную литературу. К примеру на разных дисках по программированию да и в сети часто встречается описание WhatVGA где расписаны особенности видеоадаптеров и все про работу с ними или поставь себе какую программу с хелпом по железу, тоже часто помогает.


    Отправил эксперт: VD (vdragon-pas.chat.ru - Программирование графики на Пакаль со вставками на)
    Эксперт отправил ответов (всего): 11

    Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

    Вопрос №352

    В одной программы (для скорости) мне понадобилось знать, где лежит то слово, в котором ДОС хранит позицию курсора.

    Вопрос 1: По какой формуле можно найти его адрес...

    Вопрос 2: Ну и раз уж я спросил про формулу, то где лежит тот байт, в котором записана текущая страница, (или, может быть, активна та страница, в поле которой курсор?)

    Для того чтоб узнать ответы на данные вопросы, я залез в ДОС? И нашел вместо ответов еще три вопроса?

    Вопрос 3: AfdPro дизассемблировал кусок 21h прерывания так: 36FE060203 INC B/SS:[0302]. Я не въехал, что есть "B/". Вот все остальное понял, а это?

    Вопрос 4: Вот, как одну и туже последовательность байт (из Int 21h) видят:

    Hiew 6.40:

    00000000: 7415 je 000000017
    00000002: C4 ???
    00000003: C442EB les ax,[bp][si][-0015]
    00000006: 389080FC cmp [bx][si][0FC80],dl
    0000000A: F0 lock
    0000000B: C3 retn

    TD:

    cs:0100>7415 je 0117
    cs:0102 C4C4 les ax,sp
    cs:0104 42 inc dx
    cs:0105 EB38 jmp 013F
    cs:0107 90 nop
    cs:0108 80FCF0 cmp ah,F0
    cs:010B C3 ret

    AfdPro:

    0100 7415 JZ 0117
    0102 C4 DB C4
    0103 C442EB LES AX,[BP+SI-15]
    0106 389080FC CMP [FC80+BX+SI],DL
    010A F0 LOCK
    010B C3 RET

    Кто прав? Единственное что везде совпадает это Ret, да и тот я специально поставил, его в прерывании не было J

    Вопрос 5: Почему в Int 10 после команды "C4" в Dx чудодейственным образом попадало положение курсора, да еще в виде X/Y, а не Y*80+X? При этом во всех остальных регистрах ничего похожего не было?

    Ответ

    Здравствуйте, Marmon!
    Не знаю как в ДОС, но в памяти БИОС курсор для первой страницы хранится по адресу:

    0040h:0050h (x)
    0040h:0051h (y)
    ... и так далее для 8 видео страниц
    0040h:005Eh (x - курсора страницы 8)
    0040h:005Fh (y - курсора страницы 8)

    Байт активной страницы тоже находится в сегменте 0040h
    но его смещение ищи сам, по хелпам, или может кто поможет


    Ну и наконец, для того чтобы что-то понять не обязательно везде суваться с дебагером, попробуй почитать полезную литературу. К примеру на разных дисках по программированию да и в сети часто встречается описание WhatVGA где расписаны особенности видеоадаптеров и все про работу с ними или поставь себе какую программу с хелпом по железу, тоже часто помогает.


    Отправил эксперт: VD (vdragon-pas.chat.ru - Программирование графики на Пакаль со вставками на)
    Эксперт отправил ответов (всего): 12

    Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

    Подписаться на рассылки

    Рассылки Subscribe.Ru
    Ассемблер? Это просто! Учимся программировать
    Ассемблер? Это просто! Учимся программировать (FAQ)

    Форма подачи вопроса

    ВНИМАНИЕ!!! Пожалуйста, НЕ высылайте один вопрос сразу нескольким подгруппам! Если Вы сомневаетесь, какой подгруппе следует отправить вопрос, то направляйте его в обычном текстовом виде по адресу Experts@Kalashnikoff.ru. Вопрос будет выслан соответствующей подгруппе с некоторой задержкой (от 1 до 3-х суток).
    Дополнения к вопросам, на которые эксперт уже ответил НЕ следует направлять ведущему рассылки (я не успеваю!). Просто скомбинируйте первый вопрос и дополнение к нему, а затем заново отправьте его, используя приведенную ниже форму!

    Нажимайте кнопку "Отправить" только ОДИН раз и дождитесь полной загрузки страницы, иначе вопрос будет продублирован!


    Ваше имя *:

    Ваш e-mail *:

    Подгруппы:

    Вопрос *:

    Прилагаемая программа (если необходимо):


    Регистрация в качестве эксперта

    Архив выпусков


    Ведущий рассылки,

    Калашников Олег: Assembler@Kalashnikoff.ru
    ICQ No.:
    68951340
    URL сайта подписчиков: http://www.Kalashnikoff.ru

    ______________

    По вопросам сотрудничества, рекламы и спонсорства обращайтесь:

    1. Публичное размещение материала из рассылки: Cooperation@Kalashnikoff.ru
    2. Реклама на сайте, в книге и рассылках: http://www.Kalashnikoff.ru/Reklama.html, Reklama@Kalashnikoff.ru
    3. Издание книги (спонсорство): Sponsor@Kalashnikoff.ru

    Рассылка 'Ассемблер? Это просто! Учимся программировать (FAQ)' Рассылка 'Ассемблер? Это просто! Учимся программировать'


    (C) Москва, 2001. Авторское право принадлежит Калашникову О.А. Публичное размещение материала из рассылки, а также его использование полностью или частично в коммерческих или иных подобных целях без письменного согласия автора влечет ответственность за нарушение авторских прав.


    http://subscribe.ru/
    E-mail: ask@subscribe.ru
    Отписаться Рейтингуется SpyLog

    В избранное