При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Ассемблер? Это просто! Учимся программировать (FAQ)
Выпуск N 017 |
Вопросы, которые поступили от подписчиков рассылки
"Ассемблер? Это просто! Учимся программировать"
Дата выхода: 2001-06-10
Вопрос №48
Объясните пожалуйста в чём разница между SIMM, DIMM и RIMM ?
Ответ
SIMM(Single Inline Memory Module)
Бывают 30-pin, использовались в 386-х машинах, ставилось по 4 штуки. Объемы 256Кб-4Мб в модуле. И 72-pin - 486-Pentium, ставились по 2 штуки. Объемы 1Мб-128Мб. И те и другие сейчас уже устарели и используются в основном в перефирии(принтерах всяких).
DIMM(Dual Inline Memory Module). Отличаются повышенной скоростью по сравнению с SIMM от 66 МГц и выше, вместо максимум 33. Ставятся в компьютер по одному. Начало ипользования - некоторые Pentium. Дешевка - 128Мб = 20$, 256Мб = 50$ - одной палкой за 133 МГц версию.
RIMM(Rambus Inline Memory Module) - продвигаются фирмой Intel. Используются в Пентиум-4, имеют запредельные скорости передачи до 1600Мб в секунду. Дороже DIMM примерно раз в 5(128Мб=около 100$)
Вопрос №51
Здравствуйте!
Есть вопрос: возьмём простейшую программу запустим её в отладчике и видим что наша программа содержащая 15 строк в нём имеет гораздо больший объём, откуда-то берутся лишние операторы. В чём же дело, и как определить реальный конец программы (я так думаю кнопку F1(step) можно нажимать очень долго).
Заранее спасибо.
Ответ
нет, если ваша программа имеет 15 строк, то и в отладчике она будет иметь 15 строк. дело в том, что в сегменте кода до вашей программы была какая-то другая информация. и так как ваша программа явно весь сегмент не забила, то после нее осталось все то, что было до того как она была загруженна. но отладчик все, что он находит в сегменте кода, считает это кодом, и поэтому переводит весь мусор в мнемоники, на самом деле все это к программе никакого отношения не имеет. так же если это com программа, то данные размещаются в том же сегменте, что и код, и отладчик в окне сегмента кода их так же переводит в мнемоники.
если вы написали программу, то вы, я думаю, знаете где у нее конец, поэтому просмотрев ее не трудно найти конец. если это com программа, начинайте смотреть со смещения 100h.
может кнопку F1 (Help) и можно нажимать очень долго, трассировке это мало поможет, а вот F7 при такой маленькой программе совсем не долго, т.е. пока не дойдет до выхода из программы (ret или int 20h или ah=4Ch int 21h).
С наилучшеми пожеланиями,
Андрей Беженарь aka BELTSY
Отправил: BELTSY
---Вырезано ведущим---
Эксперт отправил ответов (всего): 12
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №52
Я сделал резидент, как описывалось в рассылке. Затем запустил NC изпод WIN, и там загрузил резидент в память. Потом закрыл NC (вышел в WIN), а потом снова запустил NC.
После этого резидента в памяти не стало. Почему?
Андрей
Ответ
Не удивительно!
Потому что каждая досовая задача работает в своем, виртуальном адресном пространстве. и при закрытии досовой сессии (NC в твоем случае) все загруженные резиденты тоже исчезают без следа!
Чтобы твой резидент жил всегда, тебе надо запускать его до запуска Windows. из autoexec.bat например.
Вопрос №52
Я сделал резидент, как описывалось в рассылке. Затем запустил NC изпод WIN, и там загрузил резидент в память. Потом закрыл NC (вышел в WIN), а потом снова запустил NC.
После этого резидента в памяти не стало. Почему?
Андрей
Ответ
Потому что когда ты запускаешь NC, Виндоус запускает сеанс МС-ДОС, а уже в нем запускается NC. Когда ты из NC выходишь,то Виндоус сам пытается закрыть сеанс МС-ДОС и тебя по идеи должны спросить что-то про всплывающие программы. И закрыть ты его не сможешь, пока не ответишь, что они тебе не нужны(ctrl+C). Это Виндоус так обзывает резиденты. Так что, когда ты выходишь из NC, ты добровольно(другого выбора просто нет) подтверждаешь выгрузку этого резидента. Решение тупое, но действенное. САМ запускаешь сеанс МС-ДОС, из него NC и резидент. Выход из NC не привещдет к закрытию сеанса МС-ДОС и резидент останется жить, пока ты не выйдешь из этого режима МС-ДОС командой exit
Вопрос №53
Здравствуйте господа эксперты. В прошлый раз я писал про ошибку линкования 32 битных программ которая у меня была. Ответ эксперта Евгения меня очень удовлетворил, эта ошибка не появляется, за что ему большое спасибо. Появляется другая ошибка : Turbo Link Fatal: No program entry point. По логике этот program entry point должен находится на MOV EAX,@data Каким образом я устанавливаю этот point ? Обновил версию до Turbo Assembler 5.0. Получился Turbo Link Version 7.1.30.1. Программу исправленную экспертом Евгением прилагаю без изменений.
Ответ
Ответ: ставишь метку (begin например)перед нужной инструкцией и завершаешь файл надписью
end метка
Когда у тебя программа состоит из нескольких подпрограмм вместо имени метки ставишь имя подпрограммы с которой должна начинаться программа.
Вопрос №53
Здравствуйте господа эксперты. В прошлый раз я писал про ошибку линкования 32 битных программ которая у меня была. Ответ эксперта Евгения меня очень удовлетворил, эта ошибка не появляется, за что ему большое спасибо. Появляется другая ошибка : Turbo Link Fatal: No program entry point. По логике этот program entry point должен находится на MOV EAX,@data Каким образом я устанавливаю этот point ? Обновил версию до Turbo Assembler 5.0. Получился Turbo Link Version 7.1.30.1. Программу исправленную экспертом Евгением прилагаю без изменений.
Ответ
Приветствую!
Entry point указывается следующим образом:
.code
Start:
mov ax,@data
...
mov ah, 4ch
int 21h
end Start
В данном случае слово Start является точкой входа.
Good luck. Slava V.
Вопрос №52
Я сделал резидент, как описывалось в рассылке. Затем запустил NC изпод WIN, и там загрузил резидент в память. Потом закрыл NC (вышел в WIN), а потом снова запустил NC.
После этого резидента в памяти не стало. Почему?
Андрей
Ответ
Приветствую!
Все дело в том что под Windows, открывая NC вам создается виртуальная машина (VM86) в которой создается копия первого мегабайта памяти(т.е. копия таблицы векторов прерываний, дос-а, драйверов типа Himem, Display и.т.п). После закрытия NC, VM86 закрывается. И следовательно память выделенная этой виртуальной машине освобождается, а с ней уходит в небытие и резидент :-))
Good luck. Slava V.
Вопрос №53
Здравствуйте господа эксперты. В прошлый раз я писал про ошибку линкования 32 битных программ которая у меня была. Ответ эксперта Евгения меня очень удовлетворил, эта ошибка не появляется, за что ему большое спасибо. Появляется другая ошибка : Turbo Link Fatal: No program entry point. По логике этот program entry point должен находится на MOV EAX,@data Каким образом я устанавливаю этот point ? Обновил версию до Turbo Assembler 5.0. Получился Turbo Link Version 7.1.30.1. Программу исправленную экспертом Евгением прилагаю без изменений.
Ответ
Попробуй вот это. У меня стоит Tasm 2.0 Компилируй без параметров.
Приложение:
Вопрос №55
Чем отличаются комманды LEA STR от offset STR ?
Ответ
Hi vk!
Опрератор OFFSET - Возвращает смещение пременной относительно сегметна.
Команда LEA - вычисляет исполнительный адрес (часть его определяющую
смещение) и записывает в данный регистр. Адрес вычесляется в соответствии
с установленным режимом адресации (16 или 32), короче
lea si,[STR+bp] - тут загрузится адрес
mov si,offset [STR+bp] а тут значение по этому адресу.
Вопрос №57
Привет!
Я долгое время занимался прграммированием на ассемблере на спектуме.
На спектруме экран прорисовывается 50 раз в секунду. Начинает прорисовываться сразу после прихода маскируемого прерывания.Т.о. можно синхронизировать изображение
относительно прерываний.Следовательно можно написать программу,которая будет выводить на экран какой-нибудь объект (например бегущую строку), который будет плавно перемещаться и не моргать.
Как на PC синхронизировать изображение?Возможно ли это?
Ответ
Простейшим способом избавления от "моргания" объекта рисовать его поочередно на разных видеостраницах, с поочередной же сменой отображаемых и отрисовываемых страниц. Но это возможно только для режимов с низким разрешением. Как говорят умные книжки - есть еще синхронизатор. Порт выбора регистра синхронизатора 3C4h, а порт данных - 3C5h.
Для установки монопольной записи в видеопамять необходимо сбросить бит 1 в регистре №0, а затем установить бит №5 в регистре №1. После проделанных действий прекращается выдача из видеопамяти на экран, зато процессор получает монопольный доступ к ней. После вывода нужных данных в видеопамять необходимо восстановить выдачу данных на экран. Сбросим бит 5 в регистре №1 и установим бит 1 в регистр №0. Этот метод можно использовать только для видеоадапиеров VGA и SVGA.
P.S. Если напишешь программу, которая это ипользует пожалуйста пришли. Интересно, книжка конечно хорошая, но ничто не заменит живого примера.
Подписаться на рассылки
Регистрация в качестве эксперта
Ведущий рассылки,
Калашников Олег:
Assembler@Kalashnikoff.ru
ICQ No.: 68951340
URL сайта подписчиков:
http://www.Kalashnikoff.ru
______________
По вопросам сотрудничества, рекламы и спонсорства обращайтесь:
(C) Москва, 2001. Авторское право принадлежит Калашникову О.А. Публичное размещение материала из рассылки, а также его использование полностью или частично в коммерческих или иных подобных целях без письменного согласия автора влечет ответственность за нарушение авторских прав. |
http://subscribe.ru/
E-mail: ask@subscribe.ru | Отписаться | Рейтингуется SpyLog |
В избранное | ||