- •В.Ф. Гузик, с.М. Гушанский, в.А. Каляев, а.О. Пьявченко, а.И. Костюк основы программирования на языке «ассемблер»
- •1. Введение для кого написано это учебное пособие.
- •2. Предварительные сведения или азы, которые необходимо знать!
- •2.1. Ассемблер, что это такое?
- •2.2. Как писать ассемблерную программу, и какие программы нужны для ее последующей трансляции.
- •2.3. Системы счисления
- •2.4. Оперативная память.
- •2.5. Стек
- •Сегментация памяти.
- •Программная модель процессора.
- •Система команд.
- •Inc word ptr [bx]
- •2.9 Выделение памяти под переменные и массивы
- •2.10 Exe и com программы
- •2.11 Трансляция ассемблерной программы
- •Passes: 1
- •Примеры программирования на ассемблере.
- •3.1. Наша первая программа.
- •3.2. Работа с клавиатурой и экраном.
- •Прерывания dos для работы с клавиатурой.
- •Функция 7 прерывания int 21h
- •Функция 6 прерывания int 21h.
- •Функция 0ah прерывания int 21h.
- •Прерывания bios для работы с клавиатурой
- •1. Функция 0 прерывания int 16h Входные параметры: нет
- •2. Функция 1 прерывание int 16h Входные параметры: нет
- •1. Функция 2 прерывания int 21h
- •2. Функция 9 прерывание int 21h
- •Функция 1 прерывание int 10h
- •Функция 2 прерывание int 10h
- •Функция 3 прерывание int 10h
- •Функция 6 прерывание int 10h
- •Функция 9 прерывание int 10h
- •Функция 0eh прерывания int 10h
- •Работа с гибкими дисками.
- •Inc nomber
- •3.4. Перехват прерываний и создание резидентных программ
- •Inst: mov ah, 9
- •Inst: mov ah,9
- •3.5. Работа со звуком.
- •Отладка программ.
- •Приложение
- •Сервисные прерывания dos.
- •Сервисные прерывания bios.
- •Int 10h, функция 07h. Инициализация или прокрутка окна вниз.
- •Int 10h, функция 08h. Чтение символа и атрибута в позиции курсора.
- •Int 10h, функция 09h. Запись символа и атрибута в позицию курсора.
- •Int 10h, функция 0ah. Запись символа в позицию курсора.
- •Int 10h, функция 0eh. Запись символа в режиме телетайпа.
- •Int 10h, функция 10h, подфункция 03h. Переключение бита «мерцание/яркость».
- •Int 10h, функция 13h. Запись строки в режиме телетайпа.
- •Int 15h, функция 86h. Программная задержка на заданное число микросекунд.
- •Int 16h, функция 00h (10h). Чтение символа с клавиатуры.
- •Int 16h, функция 01h (11h). Чтение символа с клавиатуры.
- •Int 16h, функция 02h (12h). Получение статуса клавиатуры.
- •Int 1ah, функция 0h. Число тиков таймера.
- •Коэффициенты пересчета для нот
- •Значение цветов в байте атрибута
- •Буфер клавиатуры.
- •Литература
- •7. Содержание
2.3. Системы счисления
Любое число может быть задано в различных системах счисления. Например, число 130 в различных системах счисления выглядит так:
-
130
десятичная
10000010
двоичная
82
шестнадцатеричная
202
восьмеричная
Наиболее часто при написании ассемблерных программ используются числа, заданные в 10-й и 16-й системах счисления. Реже, но все-таки достаточно интенсивно, используется двоичная система счисления. Именно ими мы и ограничимся, хотя надо честно признать, что здесь сознательно упущена довольно широко используемая «двоично-десятичная» система счисления.
Для того чтобы транслятор мог понять, о какой системе счисления идет речь при задании в программе какого-либо числа, справа от этого числа пишется соответствующая буква:
-
130
десятичная
10000010b
двоичная
82h
шестнадцатеричная
Проще говоря, если буквы нет, транслятор понимает число, как 10-е и сам переводит его в двоичный эквивалент, с которым уже и работает процессор. Если есть буква h (hexadecimal), транслятор понимает это число как 16-е и сам переводит его в двоичный эквивалент и. т. д. Буква b означает двоичную систему (binary).
Кстати, транслятор считает значительно быстрее и правильнее, чем «человек с калькулятором», поэтому если Вам надо в Вашей программе, допустим, занести в регистр ax значение 34*21/ 8, смело пишите:
mov ax, 34*21/8 транслятор сам все подсчитает лучше Вас.
Но не стоит быть слишком смелым (вот мы уже и отвлекаемся от основной темы раздела). Если Вы не уверены в том, как транслятор поймет Вашу конструкцию, лучше ее не пишите. Любую конструкцию обычно можно задать разными способами. При этом лучше выбрать способ, в котором Вы будете уверены, хотя, возможно, Вам при этом придется написать и больше команд. Например, программист ввел в программе три переменные x, y и z
x db 7 ; директивой db программист «попросил» транслятор выделить в памяти байт ; для переменной, которую программист назвал х, и занести в этот байт число 7
y db 17
z db 3
; затем где-то в программе программист написал команду
mov al, x+2
Если программист при этом рассчитывает, что в регистр al попадет 7+2=9, то он заблуждается. В al попадет 3 (адрес Х плюс 2 байта = адрес Z, по этому адресу из памяти и будет выбрана информация). Чтобы в al действительно попало 7+2=9, надо было писать:
mov al, x ; занести в al значение переменной х
add al, 2 ; прибавить к содержимому al двойку
Вернемся к нашей основной теме. У новичков часто возникает вопрос: «А какую систему счисления лучше использовать в моей программе?» Отвечаем, та или иная система счисления используется в зависимости от ситуации. Например, в регистр al надо занести число 112, здесь удобно написать:
mov al, 112
Теперь в al надо занести 12, а в регистр ah – 9. Можно написать:
mov al, 12 ; в al 00001100b= 0ch
mov ah, 9 ; в ah 00001001b= 9h
Но ведь можно написать и короче, учитывая, что ah и al составляют вместе регистр ax:
mov ax, 90ch ; в ax 0000100100001100b = 090ch.
Курсивом выделена та часть числа, которая попадает в ah. То есть здесь удобно использовать 16-ю систему счисления. (Если бы мы использовали 10-ю и написали бы mov ax, 912 это было бы неправильно, поскольку транслятор, переведя 912 в двоичный код, получил бы 0000001110010000 то есть ah попало бы 3, а в al – 144, что никак не соответствует заданию).
Двоичную систему часто используют, например, при задании управляющих слов, в которых каждый отдельный бит несет в себе определенную управляющую информацию.
Отметим следующий важный момент. В шестнадцатеричной системе счисления в качестве цифр используются буквы: a (10), b (11) ….. f (15). Если мы напишем в программе число с7а3h, транслятор не поймет, что речь идет о числе, он будет считать, что это идентификатор какой-то переменной. Поэтому, если число начинается с буквы, перед этой буквой надо писать цифру 0!. В этом случае транслятор поймет, что речь идет о числе, а не о переменной. Итак, правильная запись нашего числа - 0c7a3h. Начинающие программисты часто забывают об этом правиле, в результате транслятор начинает выдавать сообщения об ошибках.