- •Лучший курс лекций по лучшему языку программирования – языку ассемблера Блок управления памятью (mcb)
- •Программирование на Ассемблере для ibm pc
- •Программная модель 8086
- •Программная модель мп
- •Сегментная память
- •Вывод на экран
- •Вывод строки символов
- •Вывод на экран шестнадцатеричного числа
- •Процедуры
- •Ввод символов
- •Вывод на экран двоичного числа
- •Работа с дисковыми файлами
- •Префикс сегмента программы (psp)
- •Структура префикса программного сегмента.
- •Прерывания.
- •Табличные вызовы подпрограмм.
- •Макрокоманды.
- •Макроопределения.
- •Использование параметров в макроопределениях.
- •Директива local
- •Использование библиотек макроопределений.
- •Конкатенация. (&)
- •Директивы повторения.
- •Условные директивы.
- •Перечисление условных директив.
- •Пример использования ifnb.
- •Пример использования макроопределений.
- •Резидентные программы tsr (terminate and stay resident)
- •Защита резидентной программы от повторной загрузки.
- •Выгрузка резидентной программы.
- •Переключение стека в резидентной программе.
- •Обработчик прерываний от таймера
- •Контроллер прерываний и его программирование
- •Взаимодействие прикладных и системных обработчиков прерываний
- •Резидентный обработчик прерываний от клавиатуры с подключением до системного
- •Резидентный обработчик прерывания от клавиатуры с подключением после системного обработчика
- •Резидентный обработчик прерываний от клавиатуры с подключением как до, так и после системного.
- •Вывод на экран текста средствами bios
- •Режимы дисплея
- •Работа с видеобуфером.
- •Логическая организация текстового видеобуфера.
- •Программирование портов. Звук.
- •Программирование звукового канала таймера.
- •Интерфейс с Си
- •Программы с несколькими сегментами команд.
- •Программы с несколькими сегментами данных.
- •Директива assume. Инициализация сегментных регистров и замена сегментов.
- •Структуры и записи.
Вывод на экран
Инструкция INT - interrupt – прерывание.
20H AX INT 21H – вызов функции DOS
41H DX код символа
Значение 02h в регистре AH – номер функции.
INT 20H – выход из программы.
MOV AH, 02H ; загружаем в AH число 02h
MOV AH, 02H MOV DL, 2AH INT 21H INT 20H |
|
Печать * на экране |
Вывод строки символов
INT 21H, но с другим номером функции.
Для 02Н – 1 символ
09Н – печатает целую строку, пока не встретит символ ‘$’
MOV AH, 09
MOV DX, 0200H
INT 21H
INT 20H
Вывод на экран шестнадцатеричного числа
Вывод на экран одной шестнадцатиричной цифры:
Сhar |
ASCII Code (HEX) |
|
В программе шестнадцатеричное число должно начинаться с 0 (для того, чтобы отличить от меток или от обозначения регистров), если число начинается с буквы. Например, число А – 0Ah, а не AH – чтобы не путать с регистром AH.
Пусть в регистре BL шестнадцатеричное число 0h0Fh. Тогда получение ASCII кода числа осуществляется с помощью следующей программы:
BL = BL+ 030h if BL 03Ah then BL=BL+07h
На ассемблере: MOV AH, 02H MOV DL, BL ADD DL, 030H CMP DL, 03AH JL PRINT |
/ |
2F |
+030H |
|
0 |
30 |
||
1 |
31 |
||
2 |
32 |
||
3 |
33 |
||
4 |
34 |
||
5 |
35 |
||
6 |
36 |
||
7 |
37 |
||
8 |
38 |
||
9 |
39 |
||
: |
3A |
|
|
; |
3B |
||
|
3C |
||
= |
3D |
||
|
3E |
||
? |
3F |
||
@ |
40 |
A |
41 |
+037H |
ADD DL, 07H PRINT: INT 21H INT 20H |
B |
42 |
||
C |
43 |
||
D |
44 |
||
E |
45 |
||
F |
46 |
||
G |
47 |
|
Процедуры
Это список инструкций, который можно вызвать из различных мест программы. Аналог функции в С и подпрограммы.
Процедуру можно вызвать с помощью CALL имя, и выход с помощью REТ. Адрес возврата запоминается в стеке.
САLL имя
…….
и мя: …
…
процедура
….
….
RET
……
Теперь напишем программу распечатки содержимого регистра BL.
MOV DL, BL
RCR DL, 4 ; сдвиг вправо на 4 бита
MOV DL, BL
CALL PRINT_HEX
INT 20H
PRINT_HEX:
AND DL, 0FH
ADD DL, 030H
CMP DL, 03AH
JL PRINT
ADD DL, 07H
PRINT: INT 21H
RET
Ввод символов
Вызов DOS через INT 21H, предварительно загрузив в AH единицу, обеспечив ввод одного символа.
Решим следующую задачу – сформировать байт из шестнадцатеричного числа (из 2-х шестнадцатиричных цифр). Если вводится символ, который нельзя преобразовать в шестнадцатеричную цифру, то – звонок.
CALL INP_HEX
MOV AL, DL
RCL DL, 4
CALL INP_HEX
ADD DL, AL
MOV AH, 02
INT 21H
INT 20H
INP_HEX:
PUSH DX
MOV AH, 08 ; считать символ, но не выводить его на экран
LOOP: INT 21H
CMP AL, 030H
JB BEEP
CMP AL, 046H
JA BEEP
CMP AL, 039H
JA CONT
MOV AH, 02
MOV DL, AL
SUB AL, 030H
POP DX
RET
BEEP: INT 21H
CONT: CMP AL, 041H
JB LOOP
MOV AH, 02
MOV DL, AL
INT 21H
SUB AL,037H
POP DX
RET