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

RFpro.ru: Ассемблер? Это просто! Учимся программировать


Хостинг портала RFpro.ru:
Московский хостер
Профессиональный ХОСТИНГ на базе Linux x64 и Windows x64

РАССЫЛКИ ПОРТАЛА RFPRO.RU

Лучшие эксперты данной рассылки

Boriss
Статус: Академик
Рейтинг: 2664
∙ повысить рейтинг »
Абаянцев Юрий Леонидович aka Ayl
Статус: Профессионал
Рейтинг: 2261
∙ повысить рейтинг »
vladisslav
Статус: 8-й класс
Рейтинг: 1337
∙ повысить рейтинг »

/ КОМПЬЮТЕРЫ И СОФТ / Программирование / Assembler (Ассемблер)

Номер выпуска:1419
Дата выхода:28.01.2011, 04:00
Администратор рассылки:Лысков Игорь Витальевич (Старший модератор)
Подписчиков / экспертов:219 / 67
Вопросов / ответов:1 / 1

Вопрос № 181963: Здравствуйте! У меня возникли сложности с такими вопросами: в приложении программа, написана для ФАСМа, но при компиляции появляется ошибка Prog.asm (361): je .end. Я знаю, почему она появляется. .end – локальная метка и она должна быть в своём блок...



Вопрос № 181963:

Здравствуйте! У меня возникли сложности с такими вопросами: в приложении программа, написана для ФАСМа, но при компиляции появляется ошибка Prog.asm (361): je .end. Я знаю, почему она появляется. .end – локальная метка и она должна быть в своём блоке, но
.end:
popad
ret
находится совсем в другом блоке. Тогда я скопировал вышеприведённые три строчки в блок, где есть строка je .end. Место и скопированные строки я закомментировал, они находятся в самом конце программы.
1 Правильно ли я сделал, что скопировал и разместил именно в этом месте три строчки или их нужно разместить в другом месте?
2 Вместо ожидаемого формата exe или com у меня получился после компиляции файл bin. Что это за файл и как его запускать?
3 Более года назад, когда я вообще не знал ФАСМ и не умел даже компилировать на нём, попросил хорошего человека, спасибо ему:), перевести эту программу на ТАСМ. Он перевёл, но для формата com, и при запуске программа ничего не д елала, просто выводилась следующая строка: D:\TASM\BIN.
И мне непонятно: то ли правильным будет у программы формат bin, то ли com. И вообще работает ли она? Отчего это так ФАСМ делает bin, а ТАСМ com (или при желании exe)?
Программа взята с http://ru.osdev.wikia.com/wiki/%D0%98%D1%81%D1%85%D0%BE%D0%B4%D0%BD%D1%8B%D0%B9_%D0%BA%D0%BE%D0%B4:%D0%9F%D0%BE%D0%B8%D1%81%D0%BA_HDD_%D0%B8_CD

Отправлен: 23.01.2011, 03:25
Вопрос задал: Masada (Посетитель)
Всего ответов: 1
Страница вопроса »


Отвечает Лысков Игорь Витальевич (Старший модератор) :
Здравствуйте, Masada!
Сначала давайте выясним, для какой ОС данная программа. Обратите внимание, что в тексте программы активно используются команды in/out
Данные команды являются привиллегированными и в пользовательском режиме многопользовательской системы Windows приведут к исключению, другими словами, программа будет, попросту говоря, завершена по ошибке. Значит, программа расчитана на работу в ДОС. Это раз.
Два. В тексте нет ничего, что говорило бы о взаимодействии с операционной системой, должен быть, хотя бы код для завершении программы. Отсюда вывод: приведен фрагмент, вырванный из какой-то другой программы.
Три. Анализ подпрограмм и прогон под отладчиком показал, что данные подпрограммы вообще никак не работают. Результат - ноль.
Четыре. В подпрограмме заложена явная ошибка, приводящая к зависанию:
Код:
.Label2:
add ecx, 256
; Нужно бы добавить проверку на то, есть функции или нет.
cmp ecx, 80FFFF00h ; Максимум 256 шин.
jne .Label1
mov ecx, 0FFFFFFFFh ; Не нашли
.Label3:
Данный фрагмент никогда не завершится, т.к. всегда cl = 8, а не 0. Поэтому равенства ecx = 80FFFF00h никогда не будет!
Т.о., код не работоспособен

Теперь отвечу на заданные вопросы:

>1 Правильно ли я сделал, что скопировал и разместил именно в этом месте три строчки или их нужно разместить в другом месте?
Неправильно. Вы скопировали три строки из другой подпрограммы. Та попрограмма начинается с pushad. Поэтому и должна перед выходом восстановить все регистры. Наша же подпрограмма вначале сохраняет только три регистра eax, esi и edi. Вот и надо поставить метку .end перед их восстановлением. Поэтому делаем так:
Код:

jne .Next
.end:
pop edi
pop esi
pop eax
ret



>2 Вместо ожидаемого формата exe или com у меня получился после компиляции файл bin. Что это за файл и как его запускать?
Вы его не запустите никак! А получился bin, потому что Вы не сказали, что же Вы хотите получить! Для программы под ДОС необходимо в начало вставить
Код:
format MZ

Вот тогда Вы сможете получить exe под ДОС. Сделайте что-то типа следующего:
Код:
format MZ

OS_BASE equ 0
IDEBasesPorts equ OS_BASE+6F00h
IDEMaxConroller equ 4
IDEMaxCanals equ 8

IDEBusMaster equ IDEBasesPorts+20h ;Всего 8 каналов 8*2*2=32Байта
IDEBusIRQ equ IDEBasesPorts+ 30h ;Всего 4 вхождения по 4 байта
IDEHDD_CD equ IDEBasesPorts+34h
IDELBA48 equ IDEBasesPorts+38h

call FindHDD

mov ax, 4c00h
int 21h

FindHDD:

Еще раз повторяю, программа ничего не делает! Впустую &qu ot;промолачивает" и выходит!

> 3 Более года назад, когда я вообще не знал ФАСМ и не умел даже компилировать на нём, попроси л хорошего человека, спасибо ему:),
> перевести эту программу на ТАСМ. Он перевёл, но для формата com, и при запуске программа ничего не делала,
> просто выводилась следующая строка: D:\TASM\BIN. И мне непонятно: то ли правильным будет у программы формат bin, то ли com.
> И вообще работает ли она? Отчего это так ФАСМ делает bin, а ТАСМ com (или при желании exe)?
Я ответил выше

Вполне допускаю, что изначально данные подпрограммы были расчитаны на работу в драйвере Windows.
Но это тема отдельного разговора...
-----
Люби своего ближнего, как самого себя

Ответ отправил: Лысков Игорь Витальевич (Старший модератор)
Ответ отправлен: 24.01.2011, 13:50
Номер ответа: 265575
Украина, Кировоград
Тел.: +380957525051
ICQ # 234137952
Mail.ru-агент: igorlyskov@mail.ru

Оценка ответа: 5
Комментарий к оценке:
Чёткий и ясный ответ!

Вам помог ответ? Пожалуйста, поблагодарите эксперта за это!
Как сказать этому эксперту "спасибо"?
  • Отправить SMS #thank 265575 на номер 1151 (Россия) | Еще номера »
  • Отправить WebMoney:


  • Оценить выпуск »
    Нам очень важно Ваше мнение об этом выпуске рассылки!

    Задать вопрос экспертам этой рассылки »

    Скажите "спасибо" эксперту, который помог Вам!

    Отправьте СМС-сообщение с тестом #thank НОМЕР_ОТВЕТА
    на короткий номер 1151 (Россия)

    Номер ответа и конкретный текст СМС указан внизу каждого ответа.

    Полный список номеров »

    * Стоимость одного СМС-сообщения от 7.15 руб. и зависит от оператора сотовой связи. (полный список тарифов)
    ** При ошибочном вводе номера ответа или текста #thank услуга считается оказанной, денежные средства не возвращаются.
    *** Сумма выплаты эксперту-автору ответа расчитывается из суммы перечислений на портал от биллинговой компании.



    В избранное