Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Ассемблер? Это просто! Учимся программировать (FAQ)
Ассемблер? Это просто! Учимся программировать (FAQ)
Выпуск N 012 |
Вопросы, которые поступили от подписчиков рассылки
"Ассемблер? Это просто! Учимся программировать"
Дата выхода: 2001-06-03
Вопрос №3
Здавствуйте уважаемые эксперты, есть вопросик по поводу исправления одной программки. Она занимается форматированием текста (после знаков препинания пробел, новый абзац с краной строки, если после точки стоит строчная буква она меняется на заглавную. Приэтом она должна работать через буфер). Как сделать чтобы она форматировала файл размером больше, чем 16Кб, т.е. забить сегмент памяти, а потом запустить, поцесс дальнейшей обработки в цикл с последующей записью в файл. Желательно чтобы эта прога обрабатывала файлы до 2Гб. Исходник прилагается. Заранее благодарен.
Олег
Ответ
Суть изменений состоит в том, что Открытие, Чтение/Запись и Закрытие файлов выполняется разными подпрограммами. Основная же часть выполняется, пока из файла можно что-то считать. ДОСовская функция чтения из файла возвращает в регитсре AX количество реально прочитанных байтов. Если равно заданному(размеру буфера в 16Кб), то значит из файла еще можно что-то считать. Результат проверки записываем в FLAG. После обработки содержимого буфера и записи его в файл, проверяем, установлен ли флаг. Если да то продолжаем обработку.
Места изменений постарался пометить комментарием ;+++++++++++++
P.S. Вообще-то надо делать её аккуратнее, поскольку на стыках она может начать показывать "краевые эффекты", т.е. будет забывать информацию из предыдущего блока.
Приложение:
Отправил: Александр
Эксперт отправил ответов (всего): 7
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №14
Уважаемые эксперты.
По выпуску № 008 возник вопрос. В оставленной Олегом программке просмотра файла имеем:
...
mov Handle,ax
mov bx,ax
mov ah,3Fh
mov cx,0FF00h
mov dx,offset Buffer
int 21h
...
Не совсем понятно, зачем мы кладём 0FF00h в CX.
В пояснениях выпуска № 009 имеем:
(8) mov cx,0FF00h ;будем читать 0FF00h
Мне это не очень понятно. Объясните, пожалуйста.
Заранее спасибо.
hk_teapot
Ответ
Перед программой было написано:
Итак, вот образец чтения файла (до 64000 байт) в память, а, точнее, в наш сегмент (это и будет программкой для практики)
Конец цитаты.
Ну если ты любишь точность поставь не FF00h=65280, а FA00h=64000, но суть программы от этого не изменится. Мы просим ПОПЫТАТЬСЯ прочитать заданное количество байт, которое и записываем в регистр CX. Реально же прочитанное количество данных функция возвращает в регистре AX. Это нужно для того, чтобы не узнавать размер файла, и вообще для упрощения жизни. Да почему еще 64000 байт? Ответ - для того, чтобы читать как можно более длинные файлы, оставив в сегменте место и под другие переменные.
Отправил: Александр
Эксперт отправил ответов (всего): 8
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №14
Уважаемые эксперты.
По выпуску № 008 возник вопрос. В оставленной Олегом программке просмотра файла имеем:
....
mov Handle,ax
mov bx,ax
mov ah,3Fh
mov cx,0FF00h
mov dx,offset Buffer
int 21h
....
Не совсем понятно, зачем мы кладём 0FF00h в CX.
В пояснениях выпуска № 009 имеем:
(8) mov cx,0FF00h ;будем читать 0FF00h
Мне это не очень понятно. Объясните, пожалуйста.
Заранее спасибо.
hk_teapot
Ответ
ну в данном случае в регистр cx мы помещаем число байт , которое будем читать из файла в данном случае это 255 байт, вот и всё :)
Отправил: sasha
Эксперт отправил ответов (всего): 11
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №8
Hi. Я хотел бы узнать не знает ли кто-нибудь как программировать флопы на уровне портов ввода/вывода с полным описанием внетренних регистров, команд. Или где можно найти такую инфу (можно на English).
Заранее всем благодарен Asmlord
Ответ
Начнем с небольшого назидания. Приведу источники, в порядке частоты использования. 1-ый - собственные книжки(не обязательно бумажные), причем при отсутствии необходимой её желательно достать. 2-ой источник - интернет. 3-ий - библиотека. Приведены по удобству (IMHO) использования. Ну я не буду жадным и расскажу про одну свою книжку, так для справки. Еще я забыл. Лучший друг программиста на ассемблере - электронный справочник Ralf Brown Interrupt List(он не только о прерываниях, хотя в основном именно о них). Могу скинуть тебе на мыло его часть касающуюся портов. Ищи по аббревиатуре FDC. Точно не промахнешься - со второго раза. Хотя про контроллер FDC не так много, смотри ниже.
P.S. Книга Михаила Гука "Аппаратные средства IBM PC", издательство "Питер".
Приложение:
Отправил: Александр
Эксперт отправил ответов (всего): 9
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №15
Уважаемые эксперты
Еще один вопросик возник при просмотре программки из Выпуска № 008 в отладчике CodeView. При выполнении первой строки программы mov AX,3D00 ячейки DS:002E и DS:002F заполняются другим кодом (соответственно, 94->92 и 27->29). Кроме того, после выполнения 3Dh прерывания 21h в ячейке DS:001E появляется 08h, а после закрытия файла (3Eh прерывания 21h) ячейка принимает прежний вид (FF).
Может я слишком дотошный, извините. Ответьте на более общий вопрос: зачем мы в комовских файлах оставляем в сегменте пространство (org 100h) между его началом и кодом нашей программы? Кем и как используется это пространство?
Думаю, этот вопрос задавал себе не только я. Если в более поздних выпусках он уже рассматривался (я пока дошёл только до № 009), тогда я, наверно, забегаю вперёд.
С уважением
hk_teapot
Ответ
Насчет того как далеко ты забегаешь я не знаю, а вот залезаешь ты в PSP(Program Segment Prefix). Это такая системная область, которая заполняется для каждого файла. Именно для нее мы и оставляем 100h байт в начале. Насчет ячеек DS:002E и DS:002F я немного процитирую:
2Eh DWORD DOS 2+ process's SS:SP on entry to last INT 21 call.
Т.е. когда вызывается функция ДОС туды SS и SP сохраняются. Вот так.
По адресу DS:001E записывается дескриптор(просто номер) открытого файла, а FFh признак того, что туда можно записать дескриптор при открытии следующего файла. Вообще-то где-то в этом районе таких чисел - целый ворох, список, то есть(начиная с адреса 18h аж целых 20 байт).
Отправил: Александр
Эксперт отправил ответов (всего): 10
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №18
Здравствуйте уважаемые эксперты.
Подскажите каким образом можно вывести на экран число из
регистра или значение переменной. Пробовал выводить функцией 09h 21-го прерывания - выводится какая-то чепуха,
а хотелось бы увидеть в более понятном виде, типа шестнадцатиричном. С выводом строк проблем нет, а вот как вывести число - непонятно.
Заранее благодарен.
Ответ
Для вывода значения регистра на экран есть следующий способ:
Определяешь переменную в виде, скажем для порстоты, байта (будешь однобайтовый регистр выводить Ah,Al и т.д.)
my_var db ?,'$'
Доллар в конце думаю понятно почему. Вопросик означает, что значение пока не установлено. Затем в программке подписываешь следующее. Допустим, мы хотим регистр AL напечатать и для этого в него 1 загружаем сначала... (см. приложение) Потом значение регистра загружаешь в свою переменную, а дальше всё как в выводе строки. Напечатается рожица симпатичная:)
Ну вот и всё собственно.
Приложение:
Отправил: Алексей Чатов (http://www.bobrland.com - Плотина Бобров)
Эксперт отправил ответов (всего): 1
Экспертная группа: Работа с MASM/TASM
Вопрос №15
Уважаемые эксперты
Еще один вопросик возник при просмотре программки из Выпуска № 008 в отладчике CodeView. При выполнении первой строки программы mov AX,3D00 ячейки DS:002E и DS:002F заполняются другим кодом (соответственно, 94->92 и 27->29). Кроме того, после выполнения 3Dh прерывания 21h в ячейке DS:001E появляется 08h, а после закрытия файла (3Eh прерывания 21h) ячейка принимает прежний вид (FF).
Может я слишком дотошный, извините. Ответьте на более общий вопрос: зачем мы в комовских файлах оставляем в сегменте пространство (org 100h) между его началом и кодом нашей программы? Кем и как используется это пространство?
Думаю, этот вопрос задавал себе не только я. Если в более поздних выпусках он уже рассматривался (я пока дошёл только до № 009), тогда я, наверно, забегаю вперёд.
С уважением
hk_teapot
Ответ
Насколько известно мне, в области до 100h содержится область называемая PSP. Её объяснение будет в следующих лекциях. Там находятся данные, оставляемые операционной системой для правильной работы нашей программы. При желании можно изменить конечно и эту область.
Отправил: Алексей Чатов (http://www.bobrland.com - Плотина Бобров)
Эксперт отправил ответов (всего): 2
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №17
Здравствуйте уважаемые эксперты.
Подскажите каким образом можно вывести на экран число из
регистра или значение переменной. Пробовал выводить функцией 09h 21-го прерывания - выводится какая-то чепуха,
а хотелось бы увидеть в более понятном виде, типа шестнадцатиричном. С выводом строк проблем нет, а вот как вывести число - непонятно.
Заранее благодарен.
Ответ
Молодца. Такие задачи решаются в первую очередь и своими силами. Конечно ты увидел аброкадабру, потому что этой функцией ты выводишь СИМВОЛ, с соответствующим кодом, а не число. Вообще-то я не жадный -так что держи функцию. Хоть сам разберешься. После того как получишь СТРОКУ - ты сам знаешь, что делать
Приложение:
Отправил: Александр
Эксперт отправил ответов (всего): 11
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №17
Здравствуйте уважаемые эксперты.
Подскажите каким образом можно вывести на экран число из
регистра или значение переменной. Пробовал выводить функцией 09h 21-го прерывания - выводится какая-то чепуха,
а хотелось бы увидеть в более понятном виде, типа шестнадцатиричном. С выводом строк проблем нет, а вот как вывести число - непонятно.
Заранее благодарен.
Ответ
если с выводом строк проблем нет, то переведите число в строку и
выводите строку, именно так это и делается. например, если надо
вывести число в десятичной системе исчисления:
'0' - 30h, '1' - 31h, ...,'9' - 39h.
т.е. к каждой цифре числа надо прибавить 30h. получить эти цифры совсем не сложно: в десятичной системе надо число делить на 10,
потом брать частное от деления и опять делить на 10 и т.д. пока
не останется нуль. а остаток как раз будут нужными нам цифрами.
для любой другой системы исчисления можно использовать этот же
алгоритм, только вместо 10 другой модуль. если надо вывести в
двоичной или шеснадцатеричной (или любой другой с.и. краной 2-м),
то это еще проще, можно использовать маски.
прилагаю часть программы, которая переводит число содержащееся
в ax в строку символов и выводит его на экран.
Приложение:
Отправил: BELTSY
Эксперт отправил ответов (всего): 7
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №19
Здравствуйте Уважаемые Эксперты.
У меня возник вопрос по которому я ни где не могу найти информацию.
При програмировании SVGA видеорежимов в режиме реального адреса используется память 0a000h:0000h при чем размер ее ограничен 0ffffh байтами и если установить например режим 114h (800x600x64k color) то обьем видеопамяти требующийся для отбражения изображения составляет примерно 1 Мегабайт и в реальном режиме процессора приходится менять банки видеопамяти чтобы по частям отбражать весь Мегабайт данных.
В защищенном режиме (или в нереальном режиме) можно использовать всю оперативную память.Но как запрограммировать видеоадаптер чтобы перенести видеопамять с 0a000h:0000h на совершенно другой адрес и переключить его в режим работы LFB (Linear Frame Buffer) чтобы весь Мегабайт изображения лежал на непрерывном куске памяти?
Заранее благодарен.
Ответ
AX 4F01h
CX Номер режима.
ES:DI Указатель на буфер длиной 256 байт.
В случае успешного завершения функции int 10h с этими входными данными AH=0 и по адресу ES:DI появляется информация о выбранном режиме. Если в байте по адресу ES:DI установлен старший бит, то этот режим поддерживает LFB. А адрес этого самого LFB - двойное слово ES:[DI+28h](т.е. расположено со смещением 28h от начала буфера).
Вот кажется и всё. Вообще тебе надо почитать про функцию 4Fh прерывания int 10h побольше, таких вопросов точно не возникнет.
Отправил: Александр
Эксперт отправил ответов (всего): 12
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Подписаться на рассылки
Регистрация в качестве эксперта
Ведущий рассылки,
Калашников Олег:
Assembler@Kalashnikoff.ru
ICQ No.: 68951340
URL сайта подписчиков:
http://www.Kalashnikoff.ru
______________
По вопросам сотрудничества, рекламы и спонсорства обращайтесь:
- Публичное размещение материала из рассылки: Cooperation@Kalashnikoff.ru
- Реклама на сайте, в книге и рассылках: http://www.Kalashnikoff.ru/Reklama.html, Reklama@Kalashnikoff.ru
- Издание книги (спонсорство): Sponsor@Kalashnikoff.ru
(C) Москва, 2001. Авторское право принадлежит Калашникову О.А. Публичное размещение материала из рассылки, а также его использование полностью или частично в коммерческих или иных подобных целях без письменного согласия автора влечет ответственность за нарушение авторских прав. |
Реклама на сайте Kalashnikoff.ru
http://subscribe.ru/
E-mail: ask@subscribe.ru | Отписаться | Relayed by Corbina
Рейтингуется SpyLog |
В избранное | ||