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

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


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

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler (Ассемблер)

Выпуск № 609
от 22.11.2006, 12:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 371, Экспертов: 26
В номере:Вопросов: 4, Ответов: 9


Вопрос № 62872: Здравствуйте, уважаемые эксперты! Вопрос чайника :) Имеется следующий код. Запускаю в TASM'е. Компилируется без ошибок, но линковщик выдаёт ошибку: Error: Undefined symbol MYPROC in module PROC.ASM. Что здесь не так?...
Вопрос № 62908: Уважаемые эксперты!. Необходимо разложить вещественное число (80-ти битный расширенный вещественный формат) на состовляющие: знак, значение экспоненты и значение мантисы. Разложить нужно так, чтоб из полученых значений сделать вессовые значения (...
Вопрос № 62937: Стасу:К вопросу №62813 Создаю загрузочную дискету в Винде,в БИОСе ставлю загрузку с дискеты.Ввожу после загрузки команду DEBUG следует ответ имя файла указано неверно...
Вопрос № 62939: Привет! Скажите можно ли с помощью masm32 кампилить 16 разрядные dos приложения или он этого уже не поддерживает и нужно использовать что-то типа masm 6.12. Проблема в том, что путь к masm32 уже прописан в переменных среды и не хочется их туда сюда г...

Вопрос № 62.872
Здравствуйте, уважаемые эксперты! Вопрос чайника :)
Имеется следующий код. Запускаю в TASM'е. Компилируется без ошибок, но линковщик выдаёт ошибку:
Error: Undefined symbol MYPROC in module PROC.ASM.
Что здесь не так?

Приложение:

Отправлен: 16.11.2006, 12:23
Вопрос задал: Statesman (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Boriss
Здравствуйте, Statesman!
В модуле надо написать, что myproc доступна другим модулям программы:
public myproc
Например, после .model
И еще в модели small, чтобы не иметь лишних проблем, убери far

---------
Вывод - то место в тексте, где вы устали думать
Ответ отправил: Boriss (статус: Профессор)
Россия, Саранск
Организация: mte
WWW: Программирование на Паскале
----
Ответ отправлен: 16.11.2006, 14:03
Оценка за ответ: 5
Комментарий оценки:
Спасибо. После добавления public всё заработало

Отвечает: IceWolf
Здравствуйте, Statesman!
В модуле, для которого имя является внешним, неоходимо объявить го директивой: extrn ИМЯ:тип(для процедур far или near) , а в другом модуле это имя необходимо объявить директивой public ИМЯ .
С уважением, IceW0|f.

---------
И да покарает пингвин мелких и мягких!
Ответ отправил: IceWolf (статус: 3-ий класс)
Ответ отправлен: 17.11.2006, 02:03

Отвечает: Брона Вячеслав
Здравствуйте, Statesman!

Вам просто нужно убрать обьявление extrn myproc : far в начале текста, а call myproc (если myproc все-таки должна вызываться как far procedura) нужно подправить: call far myproc.
Ответ отправил: Брона Вячеслав (статус: 1-ый класс)
Ответ отправлен: 17.11.2006, 11:08


Вопрос № 62.908
Уважаемые эксперты!.
Необходимо разложить вещественное число (80-ти битный расширенный вещественный формат) на состовляющие: знак, значение экспоненты и значение мантисы. Разложить нужно так, чтоб из полученых значений сделать вессовые значения (строку) - так чтоб по ним можно было сортировать вещественные значения.

Проблема в том при использовании таких операцый как FBSTP (Сохранить число в формате BCD) - теряется прежняя точность значения. А значения составляющих (особено мантисы) - очень запутаны.
Отправлен: 16.11.2006, 18:58
Вопрос задал: Игнатьев Дмитрий (статус: Студент)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 0)

Отвечает: Вiктор
Здравствуйте, Игнатьев Дмитрий!
расширенное вещественное: бит 79 — знак мантиссы, биты 78–64 — 15-битная экспонента + 16 383, биты 63–0 — 64-битная мантисса с первой цифрой (то есть бит 63 равен 1). (Из книги Зубкова)
Я давно читал про дробные числа, но по-моему, есть неоднозначность. Может например быть
1) мантисса 2, экспонента 2, число = 8,
2) мантисса 2, экспонента 3, число = 16,
3) мантисса 1, экспонента 3, число = 8,
4) мантисса 16, экспонента 1, число = 32,
5) мантисса 1, экспонента 5, число = 32,
Если сортироватьпо экспоненте, выпадет №4, если по мантиссе - выпадёт №5. Хотя там ещё как-то с 63-тьим битом, не помню, так что я наверно ошибся.

---------
ни дня без строчки (но не получается)
Ответ отправил: Вiктор (статус: 9-ый класс)
Ответ отправлен: 16.11.2006, 21:48
Оценка за ответ: 5

Отвечает: ADSota
Здравствуйте, Игнатьев Дмитрий!

Сопроцессор сам умеет делить число на части командой FXTRACT. Эта команда разбивает текущую вершину стека на компоненты. Аргументом этой функции является вершина стека. Значение показателя степени замещает содержимое вершины стека, а затем дробная часть аргумента помещается в стек и становится новой вершиной стека.
То есть, после выполнения fxtract будет:
ST <- дробная часть ST
ST1 показатель степени двойки ST
Осталось сохранить эти 2 числа в памяти и сортировать по ним...
---------
Открыть глаза навстречу солнцу
Ответ отправил: ADSota (статус: Специалист)
Ответ отправлен: 17.11.2006, 09:03
Оценка за ответ: 5


Вопрос № 62.937
Стасу:К вопросу №62813 Создаю загрузочную дискету в Винде,в БИОСе ставлю загрузку с дискеты.Ввожу после загрузки команду DEBUG следует ответ имя файла указано неверно
Отправлен: 16.11.2006, 23:13
Вопрос задал: Яценко Сергей Владимирович (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: IceWolf
Здравствуйте, Яценко Сергей Владимирович!
Дело в том, что DEBUG-не команда MS-DOS, а отдельная программа debug.exe, которая находится в
<System Disk>:WINDOWSSystem32 .Вы её не скопировали на дискету вот она и не запускается. С этим отладчиком можно работать и из под Windows- Пуск-> Выполнить-> Debug .
С уважением, IceW0|f.
---------
И да покарает пингвин мелких и мягких!
Ответ отправил: IceWolf (статус: 3-ий класс)
Ответ отправлен: 17.11.2006, 00:04

Отвечает: Брона Вячеслав
Здравствуйте, Яценко Сергей Владимирович!
Думаю, после создания дискеты, нужно проверить есть-ли на ней в корневом каталоге файл DEBUG.EXE. Если такового не окажется нужно найти его в одном из подкаталогов каталога Windows и скопировать вручную на дискету.
Можно также просто записать или запомнить путь к каталогу, где лежит DEBUG.exe (например у меня в Win2000 DEBUG.exe находится в каталоге С:winntsystem32), а потом после загузки с дискеты, набрав в командной строке полный путьи имя команды запустить его (в моей системе это-бы выглядело так: c:winntsystem32debug.exe). Но этот метод гарантированно работает только, если вы будете запускать debug на том-же компьютере и в той-же ОС.
И, наконец третий метод - на вторую пустую дискету записать файлы command.com и debug.exe. И, после загрузки с первой дискеты, вынуть ее, вставить вторую и, просто набрав debug.exe в коммандной строке, щапустить его.
Ответ отправил: Брона Вячеслав (статус: 1-ый класс)
Ответ отправлен: 17.11.2006, 12:48


Вопрос № 62.939
Привет! Скажите можно ли с помощью masm32 кампилить 16 разрядные dos приложения или он этого уже не поддерживает и нужно использовать что-то типа masm 6.12. Проблема в том, что путь к masm32 уже прописан в переменных среды и не хочется их туда сюда гонять.
И еще вопрос. Есть набор процедурок. Как из этих процедурок сделать библиотеку, чтобы потом компилить ее вместе с основной прогой? Я пока использую include *.inc. Как перегнать их в *.obj, а потом подключать по необходимости? Какие компоненты masm-а нужно использовать и с какими параметрами? Если можно пример.
Отправлен: 16.11.2006, 23:27
Вопрос задал: Oxaid (статус: Посетитель)
Всего ответов: 2
Мини-форум вопроса >>> (сообщений: 2)

Отвечает: Вiктор
Здравствуйте, Oxaid!
1) masm32 не рассчитан на 16-битные дос-приложения (я думаю).
2) когда вы используете include , то нужный текст просто вставляется в файл. Т.е. при трансляции получается как бы один большой временный файл. А использование *.lib - это немного другое. По сути, в *.lib собраны один или несколько *.obj. А использование процедуры, находящейся в другой *.obj немного отличается от include.
см. приложение (Код для ТАSМ, но суть та же)
пишете код процедуры, указываете её как public, ассемблируете, получаете например sub.obj
пишете код главной программы, указываете там процедуру как extrn (с указанием типа), ассемблируете, получаете например main.obj
потом скармливаете линкеру main.obj, sub.obj
и линкер должен сделать вам рабочую main.exe (если всё правильно)
extrn указывает что будет вызов/прыжок на код, которого нет в данном модуле. И в main.obj будет указано прямым текстом что надо например _vfaa (если открыть 16-ричным редактором, то можно там найти это название).
public указывает что код данного модуля будет вызваться извне. И поэтому символьное название функции будет в sub.obj.
Линкер посмотрит что к чему и всё свяжет, как будто код процедуры и главной программы были в одном файле.

для того чтобы сделать *.lib -файл, надо взять sub.obj и используя программу LIB.EXE из пакета масм. Я сейчас не помню синтаксиса, надо указать ей название *.lib файла, который мы хотим создать, и названия *.obj-файлов, которые мы хотим туда добавить. (можно также удалять *.obj-файлы из библиотеки, если надо). Посмотрите синтаксис набрав "LIB.EXE /?" или "LIB.EXE -?" или "LIB.EXE /h", что-то подобное.

Использовать *.lib файл можно так же, как и *.obj - указывать его линкеру.

Приложение:

---------
ни дня без строчки (но не получается)

Ответ отправил: Вiктор (статус: 9-ый класс)
Ответ отправлен: 17.11.2006, 01:03
Оценка за ответ: 5

Отвечает: IceWolf
Здравствуйте, Oxaid!
Компилятор 16-разрядный код генерирует, а вот линкер придется взять из старого масма(если нужен-напишите в мини форум,я пришлю). Чтобы сделать код 16-разрядным можно, например, указать .286 (16-разрядный процессор), или указать после segment use16 (если нужны инструкции 80386).
Пишем программу, все внешние(из другого модуля) имена объявляем: extrn имя:тип,
а в другом модуле бъявляем их директивой public .Так же поступаем со вторым модулем, третьим, четвёртым и т.д. Компилируем каждый модуль: ml модуль.asm /c (/c-не линковать), линкуем: link модул1.obj модуль2.obj ..... (для .com-программы указываем /t). Передача параметров возможна через регистры, через стек, через общую область памяти. Подробней советую посмотреть, например, у Юрова.

Приложение:

---------
И да покарает пингвин мелких и мягких!

Ответ отправил: IceWolf (статус: 3-ий класс)
Ответ отправлен: 17.11.2006, 01:52
Оценка за ответ: 5


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

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

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.37 от 04.10.2006
Яндекс Rambler's Top100

В избранное