суббота, 16 мая 2009 г.

Вспоминаем первый шаг

Первым нашим шагом был вывод даты ROM BIOS в debug.exe. Теперь создадим программку, которая будет это делать сама. В книге «Язык ассемблера: уроки программирования» на стр. 32 есть эта программа, но в ней есть ошибки. Ошибки я исправил. Вот рабочий вариант этой программы:

Во всех многочисленных инкарнациях программы hello.asm для вывода на экран использовалась функция DOS 09h. Однако она требует, чтобы в конце выводимой строки стоял знак $. В ROM BIOS такого знака, естественно, нет. Поэтому для ввода на экран придется воспользоваться другой функцией DOS – 40h. Она позволяет задавать число выводимых байтов в регистре CX. Это универсальная функция, с помощью которой можно вывести на любое устройство (экран, принтер, файл и последовательный порт). Приемное устройство характеризуется значением дескриптора, которое записывается в регистр BX. Для экрана предусмотрен предопределенный дескриптор 1.
Эта программа, еще своеобразна тем, что в ней отсутствует сегмент данных. Это вполне допустимо.
В первых предложениях программы, выполняется инициализация сегментного регистра DS, однако он настраивается не на сегмент данных, а на сегмент памяти, в котором можно найти дату ROM BIOS. Далее настраиваются регистры BX, CX и DX, с помощью которых DOS передаются параметры для правильного выполнения функции вывода.
Прога ассемблируется и MASM и TASM. Ради спортивного интереса решил их сравнить побайтово с помощью fc(file compare) – стандартной проге винды. Делается это так (относительно моих каталогов конечно):

Самая первая (самая левая) колонка отображает смещение, вторая байты по этому смещению в файле ассемблированному TASM, третья – в файле MASM.
Как видно различаются только несколько первых байта в заголовке файлов. Размер файлов одинаковый, код самой программы, как видно совпадает байт в байт. Почему немного различаются заголовки, это я пока не знаю. Видимо сказываются различия ассемблеров.
Ну и напоследок запустим саму прогу и посмотрим ее вывод.

В принципе, в этой программе нет необходимости и в стеке. Так что его определение можно убрать. Программа ассемблируется и TASM и MASM, но оба выдают предупреждение, что нет стека. В нашей проге на это можно забить.

Комментариев нет: