Вывод строки в ассемблере

Как выучить английский

В наше время любой человек должен знать английский язык. А тем более программист. Потому что довольно большая часть документации существует только на английском. А профессионал не может ждать, пока кто-то переведёт ему документацию. Он должен уметь быстро получать нужную инфорамцию и использовать её, независимо от того, на каком она языке – на английском или на русском. Ссылки на курсы по английскому.

Что бы ни делала ваша программа, в большинстве случаев она должна выводить какие-то данные на экран. И если в языках высокого уровня это делается “лёгким движением руки”, то в ассемблере для этого приходится как следует помучиться.

Правда, в современных воплощениях языка Ассемблера могут быть стандартные макросы или подпрограммы для вывода строк на экран. Однако начинающим будет полезно разобраться с тем, как это можно сделать только с помощью инструкций, без применения каких-либо облегчающих жизнь библиотек.

Итак, выводить строки на экран можно двумя путями:

  1. Посимвольно (то есть в цикле выводить каждый символ строки).
  2. Строку целиком.

Кроме того, в текстовом режиме вывод на экран можно выполнить одним из трёх способов:

  1. С помощью функций DOS.
  2. С помощью функций BIOS.
  3. Путём прямой записи в видеопамять.

Третий способ хорош тем, что он сразу записывает данные в видеопамять, что позволяет выполнять вывод более быстро. Однако в наше время он применим, разве что, в учебных целях. Потому что современные операционные системы не позволяют напрямую обращаться к “железу”.

Поэтому, если ваша программа является чуть более, чем учебной, то придётся применять один из первых двух способов. Ну а если вам интересно, как выполнить вывод непосредственно в видеопамять, то посмотреть примеры вы можете здесь или здесь.

Функции вывода DOS

Итак, начнём с функций вывода DOS. Эти функции являются функциями операционной системы DOS, но поддерживаются и операционными системами Windows.

Как я уже говорил, можно напечатать на экране строку в цикле, отдельно выводя каждый символ. Для этих целей можно использовать функции 02h, 06h или недокуметированное прерывание 29h.

Если требуется вывести на экран строку целиком, то можно применить функции 09h и 40h.

Для использования функций DOS надо сначала подготовить необходимые данные, записать номер функции в регистр AH, а затем вызвать прерывание 21h.

Все функции рассматривать здесь не будем. Для примера используем одну из самых простых функций DOS – функцию 09h, которая выводит в стандартное устройство вывода (в нашем случае – на экран) строку, адрес которой находится в DS:DX. Строка должна заканчиваться символом $, иначе функция не поймёт, где конец строки, и программа будет выводить много-много символов из памяти, начиная с указанного адреса. Примерно так, как показано на рисунке:

Читайте также:  Как включить пианино в fl studio 20

При правильном использовании на экран будет выведено примерно следующее:

Функции вывода BIOS

Функции BIOS также могут выводить как отдельные символы (функции 09h, 0Ah, 0Eh), так и строки целиком (функция 13h).

Кроме того с помощью функций BIOS можно установить видеорежим, установить или считать положение курсора, а также считать символ и его атрибуты.

Хотя функции DOS тоже могут считывать символы, но всё-таки возможности BIOS более широки.

Для работы с функциями BIOS также сначала надо подготовить данные, записать номер функции в регистр AH, а затем вызвать прерывание 10h.

Для примера рассмотрим функцию 13h. Перед вызовом функции надо:

  • Записать номер функции в регистр АН.
  • Записать режим вывода в регистр AL:
  • бит 0: переместить курсор в конец строки после вывода.
  • бит 1: строка содержит не только символы, но и атрибуты. Так что каждый символ описывается двумя байтами – ASCII-код и атрибут. Это можно использовать, если в строке символы должны иметь, например, разный цвет. Если атрибуты одинаковы для всей строки, то этот бит лучше сбросить (обнулить).
  • биты 2-7: не используются.
  • Записать длину строки в регистр СХ (только число символов, байты атрибутов не учитываются).
  • Если строка содержит только символы, то записать в регистр BL атрибут. Этот атрибут будет применяться для всей строки.
  • Записать координаты экрана, начиная с которых будет выводиться строка, в регистры DL (столбец – координата Х) и DH (строка – координата Y).
  • Записать адрес начала строки в ES:BP.
  • Рассказывать об остальных функциях, а также об установке атрибутов и прочих вещах сегодня не буду. Если кому интересно, то всё это можно найти в справочных материалах.

    Пишу на fasm, должна была появится строка "Hello!", но в результате курсор куда-то пропал и я наблюдаю просто черный экран
    ; Alekill OS (c)
    org 7c00h
    Msg db ‘Hello!$’
    mov ax, 9ch
    mov ss, ax
    mov sp, 4096d
    mov ax, 7c0h
    mov ds, ax

    mov ah, 00h ; Может режим графический должен быть?
    mov al, 03h
    int 10h

    mov ah, 13h
    mov al, 0d
    mov bh, 0d
    mov cx, 15d
    mov dl, 0d
    mov dh, 0d
    mov bp, Msg
    mov es, [bp]
    int 10h

    jmp $
    times 510-($-$$) db 0
    dw 0xFF55
    Описание:
    INT 10h / AH = 13h – записать строку.

    вход:
    AL = режим записи:
    bit 0: не изменять курсор после записи;
    bit 1: строка содержит атрибуты.
    BH = номер страницы.
    BL = атрибут, если строка содержит только символы (бит 1 регистра AL – ноль) .
    CX = количество символов в строке (атрибуты не считаются) .
    DL,DH = столбец, строка – координаты, с которых начинается запись строки.
    ES:BP указатель на строку, которая будет напечатана.

    mov ah, 00h
    mov al, 03h
    int 10h

    mov ah, 13h
    mov al, 1
    mov bh, 0
    mov bl, 4h
    mov cx, 6
    xor dx, dx
    lea bp, [msg]
    int 10h

    C, C++, Java, Assembler

    Управление

    2. Этапы создания программы на языке Ассемблер. Вывод строки на экран

    2. Этапы создания программы на языке Ассемблер. Вывод строки на экран

    Цель работы: получение знаний об основных правилах записи и структуре программ на языке Ассемблер для ПЭВМ типа IBM PC; приобретение практических навыков по составлению простейших программ на языке Ассемблер.

    Читайте также:  Как включить наушники на телефоне самсунг

    Этапы создания программы

    Разработка программы на Ассемблере включает несколько шагов:

    • подготовку исходного кода программы,
    • ассемблирование программы (получение объектного кода),
    • компоновку программы (получение исполняемого файла программы),
    • отладку программы.

    Текст программы записывается в один или несколько файлов. Имена файлов и их расширения могут быть произвольными, однако принято использовать для файлов, содержащих основную программу, расширение .asm, а для вспомогательных файлов, содержащих описание констант, новых типов, библиотеки функций, – расширение .inc.

    Подготовленный текст программы необходимо преобразовать в машинные команды, которые могут быть выполнены микропроцессором. Это можно осуществить с помощью программ, называемых ассемблерами. После ассемблирования получают объектные модули с расширением .obj. Ассемблирование можно выполнить с помощью компиляторов masm фирмы Microsoft или tasm фирмы Borland.

    Процесс подготовки программы включает и процесс компоновки (редактирования связей). Работа компоновщика заключается в том, чтобы в каждом модуле определить и связать ссылки на неопределённые имена и обеспечить переместимость программы. Когда программа включает несколько модулей, компоновщик объединяет их в один файл. В итоге будет получен выполняемый файл с расширением .exe или .com. Для этих целей можно использовать программу–компоновщик link фирмы Microsoft или tlink фирмы Borland.

    Например, пусть файлы с исходными кодами называются prog1.asm и myLib.inc. В этом случае ассемблирование и компоновку можно выполнить следующими командами:

    Таблица команд ассемблирования и компоновки

    Microsoft Borland
    Этап ассемблирования masm prog1.asm
    masm myLib.inc
    tasm prog1.asm
    tasm myLib.inc
    Этап компоновки link prog1.obj
    link myLib.obj
    tlink prog1.obj
    tlink myLib.obj

    Общая схема программы на языке Ассемблер

    Строка в программе на Ассемблере может состоять из 4–х полей:

    [метка:] команда [поле операндов] [;комментарий]

    Метка используется для указания относительного адреса команды и служит для присвоения символического имени первому байту области памяти, в котором будет записан машинный эквивалент команды. Метки могут содержать:

    • буквы от A до Z, причем Ассемблер не делает разницы между строчными и прописными буквами;
    • цифры от 0 до 9;
    • спец.символы – ‘?’, ‘.'(только первый символ), ‘@'(коммерческое эт), ‘$’, ‘_’.

    Первым символом в метке должна быть буква или специальный символ. Максимальная длина метки – 31 символ.

    Поле команды содержит её имя. Операнды определяют данные, регистры, символические имена (относительные адреса).

    Например, команда mov ax, 4 заносит в регистр ax значение 4.

    В поле операндов, если оно присутствует, могут быть один или два операнда. Между собой операнды отделяются запятой. В командах с двумя операндами первый – это приемник (destination), а второй – источник (source).

    Комментарий начинается с символа ‘;‘. Все символы справа от символа ‘;’ до конца строки воспринимаются Ассемблером как комментарий.

    Так как строчные и прописные символы в Ассемблере не различаются, то записи вида mov ah, 9 и MOV AH, 9 воспринимаются Ассемблером одинаково.

    Читайте также:  Если не помнишь пин код симки

    Ниже представлены примеры оформления программ для компиляторов masm и tasm.

    ;Шаблон оформления программы в “стиле” masm .model small ; директива описания модели памяти ; программа имеет модель памяти ; типа small – один сегмент кода и один сегмент данных .stack 100 ; начало сегмента стека .data ; начало сегмента данных . ; определение данных .code ; начало сегмента кода . ; здесь можно включить текст подпрограмм и ; данные, которые необходимо расположить ; в сегменте кода .startup ; точка начала выполнения программы . ; текст программы end ; директива окончания текста программы

    ;Шаблон оформления программы в “стиле” tasm sstack SEGMENT para stack "stack" ;определение сегмента стека DB 100 dup (?) ;область стека, не менее 32 слов sstack ENDS ;конец сегмента стека sdata SEGMENT para data ;определение сегмента данных . ;здесь помещаются директивы ;определения данных sdata ENDS ;конец сегмента данных scode SEGMENT para "code" ;определение сегмента кода ASSUME CS:scode, DS:sdata ;указывает Ассемблеру, что сегмент scode будет ;адресоваться с помощью сегментного регистра CS, ;а сегмент sdata – с помощью сегментного регистра DS. здесь можно ;включить текст подпрограмм и данные, которые необходимо расположить в ;сегменте кода start: ;точка входа в программу здесь . ;помещается текст программы scode ENDS ;конец сегмента кода END start ;директива окончания текста ;программы

    Директивы определения сегмента делят исходную программу на сегменты. В программе на языке Ассемблер возможны четыре вида сегментов:

    • сегмент данных – используется для хранения переменных и констант;
    • сегмент стека – используется для хранения временных данных и адресов возврата из подпрограмм;
    • сегмент команд – в нем располагается код программы, в нем также могут располагаться подпрограммы и данные;
    • дополнительный сегмент данных.

    По крайней мере, один сегмент – сегмент команд должен присутствовать в каждой программе.

    Сегментный регистр ds должен содержать адрес сегмента, в котором описаны данные. Занести адрес в регистр можно, например, следующим образом:

    mov ax, @data ; для masm mov ds, ax или mov ax, sdata ; для tasm mov ds, ax

    Задание

    1. Изучить структуру программы на Ассемблере и основные требования к ней.

    2. Разработать программу вывода строки “Hello World” на экран в стилях masm и tasm:

    • с использованием директивы db определить в сегменте данных строку ‘Hello World’,10,13,’$’ (HidbHelloWorld’,10,13,’$’),
    • инициализировать регистр ds адресом сегмента данных,
    • с помощью функции 9 прерывания 21h вывести эту строку на экран

    mov ah, 9 ;номер функции всегда помещается в регистр ah mov dx, offset Hi ;регистр dx содержит начальный адрес ;выводимой строки int 21h ;вызов прерывания

    • завершить программу функцией 4Ch прерывания 21h

    mov ah, 4Ch int 21h

    3. С помощью текстового редактора набрать программу и записать ее на диск. Оттранслировать программу и получить объектный файл, листинг программы и исполняемый файл. Например, если исходный файл называется myLab1.asm, то с помощью команд

    Ссылка на основную публикацию
    Adblock detector