- •Таганрог 1997 Методическая разработка к лабораторным работам Программирование на языке ассемблера пэвм ibm pc
- •Введение
- •Структура описания лабораторной работы
- •Выполнение работы
- •Разработка и отладка программ на языке ассемблера
- •2.2. Обработка программ в dos
- •Трансляция программы
- •Компоновка программы
- •Запуск программы
- •2.3. Использование отладчика td
- •Как запустить программу под отладчиком
- •Что умеет и чего не умеет отладчик td
- •Меню View Окно Module
- •Окно cpu
- •Окно Watches
- •Окно Dump
- •Экран пользователя
- •Команда Instruction Trace
- •Команда Program Reset
- •3. Пример выполнения работы
- •4. Контрольные вопросы
- •2.2. Режимы адресации
- •3. Пример выполнения работы
- •4. Варианты заданий
- •5. Контрольные вопросы
- •Лабораторная работа
- •Циклические и разветвляющиеся программы1. Цель работы
- •2. Основные сведения
- •3. Пример выполнения работы
- •4. Варианты заданий
- •5. Контрольные вопросы
- •Лабораторная работа
- •Логические команды1. Цель работы
- •2. Основные сведения
- •2.1. Логические команды
- •2.2. Примеры использования логических команд
- •3. Пример выполнения работы
- •4. Варианты заданий
- •5. Контрольные вопросы
- •Лабораторная работа
- •Символьная обработка1. Цель работы
- •2. Основные сведения
- •2.1. Программные прерывания и системные вызовы
- •2.2. Функции dos для ввода с клавиатуры
- •2.3. Функции dos для вывода на экран
- •3. Пример выполнения работы
- •Inpstr db 80, ?, 82 dup( ? ) ; буфер ввода
- •Inc count[si] ;увеличиваем соответств. Счетчик
- •Xor si, si ;Счетчик цифр
- •Int 21h ; строки
- •Inc si ;Счетчик очередной цифры
- •4. Варианты заданий
- •5. Контрольные вопросы
- •Лабораторная работа
- •Десятичная арифметика
- •2.3. Команды десятичной коррекции неупакованных чисел
- •3. Пример выполнения работы
- •4. Варианты заданий
- •5. Контрольные вопросы
- •Лабораторная работа
- •Подпрограммы1. Цель работы
- •2. Основные сведения
- •2.1. Описание подпрограмм
- •2.2. Вызов подпрограмм
- •2.3. Передача параметров
- •2.4. Сохранение регистров
- •2.5. Локальные переменные
- •2.6. Директивы описания сегментов и модели памяти Модели памяти
- •Директивы определения сегментов
- •Макрокоманды начала и завершения программы
- •2.7. Расширенные директивы описания процедур
- •2.8. Область действия имен
- •2.9. Итоги
- •3. Пример выполнения работы
- •Int 21h ;Приглашение к вводу строки
- •Int 21h ;Ввод строки
- •Int 21h ; позиции удаления
- •Int 21h ;Ввод строки числа
- •Int 21h ; числа удаляемых
- •Int 21h ;Ввод строки числа удаляемых
- •Int 21h ;Заголовок вывода
- •Inc bx ;Сдвиг по строке
- •Int 21h ; Вывод результата
- •Inc bx ;Сдвиг по строке
- •4. Варианты заданий
- •5. Контрольные вопросы
- •Лабораторная работа 8 Использование подпрограмм на языке ассемблера в программах на языках c и pascal1. Цель работы
- •2. Основные сведения
- •2.1. Введение
- •2.2. ТерминЫ и сокращения
- •2.3. Соглашения о связях
- •Преобразование имен
- •Передача и возврат управления и данных
- •Сохранение регистров
- •Трансляция и компоновка
- •Преобразование данных
- •Трансляция и компоновка
- •3. Пример выполнения работы
- •3.1. Интерфейс Pascal
- •Inc si ;указатель на входную строку
- •Inc cx ;нет, увеличиваем счетчик символов
- •Inc dx ;да, увеличиваем счетчик строк
- •Inc dx ;нет, будем увеличивать счетчик строк
- •4. Варианты заданий
- •5. Контрольные вопросы
- •БиблиографИя
- •Содержание
- •Заметки
- •Дроздов Сергей Николаевич Калачев Дмитрий Петрович
2.3. Функции dos для вывода на экран
Имеются две функции для вывода на экран: одна функция для вывода одного символа, а другая – для вывода строки символов.
Функция 02h выдает в текущую позицию экрана символ, код которого содержится в регистре DL. Известно, что для машин типа IBM PC почти каждому из 256 возможных кодов соответствует какое-то графическое изображение, однако при выводе по функции 02h некоторые коды не выдаются на экран, а служат управляющими. В частности:
0Dh (CR) – перевод курсора в начало текущей строки;
0Ah (LF) – перевод курсора вниз на 1 строку;
08h (BS) – перевод курсора влево на 1 позицию;
07h (BEL) – звонок.
Функция 09h выдает, начиная с текущей позиции экрана, строку символов, адрес начала которой (в сегменте данных) содержится в регистре DX. Строка может содержать управляющие символы (CR, LF и т.п.) и, таким образом, на экране занимать несколько строк.
Концом выдаваемой строки служит символ «$» (код 24h).
Например. Чтобы вывести на экран с новой строки текст: «Привет! Вот как надо выдавать текст на экран!» – и затем перевести курсор в следующую строку, следует в сегменте данных описать строку:
PRIVET db 0Dh,0Ah db "Привет! Вот как надо выдавать текст на экран!" db 0Dh,0Ah,"$"
а в сегменте команд записать команды:
lea DX,PRIVET ; Адрес строки - вDX mov AH,09h ; Номер функции - вAH int 21h ; Вызов функции
3. Пример выполнения работы
Ввести строку с клавиатуры, посчитать количества всех десятичных цифр во введенной строке, посчитанные значения вывести на терминал.
Текст программы:
model SMALL
stack 100h
dataseg
AskCont db 0Ah,0Dh
db 'Завершить работу- Esc, продолжить - ЛЮБАЯКЛАВИША'
db '$'
Ask db 0Ah,0Dh,'Введите строку:','$'
COUNT db 10 dup( ? ) ; счетчики количества цифр
CIFR db '0123456789ABCDEF' ; таблица преобразования
; шестн.цифр для вывода
Inpstr db 80, ?, 82 dup( ? ) ; буфер ввода
OUTSTR db 0Dh,0Ah, ?, ' ', ?, ?, '$' ; буфер вывода
codeseg
startupcode
BEGIN:
;Ввод строки
lea DX, Ask
mov AH, 09h
int 21h
lea DX, INPSTR
mov AH, 0Ah
int 21h
;Обработка
xor AX, AX
lea BX, INPSTR+2 ;адрес начала введенной строки
xor CX, CX
mov CL, INPSTR+1 ;кол-во введенных символов строки
BB:
mov AL, [BX] ;очередной символ строки
cmp AL, '0' ;код символа меньше, чем код нуля?
jb NC ;да, т.е. не цифра
cmp AL, '9' ;код символа больше, чем код девятки ?
ja NC ;да, т.е. не цифра
;символ - десятичная цифра
sub AL, '0' ;получаем дв. значение цифры, т.е.
mov SI, AX ; индекс в массиве счетчиковCOUNT
Inc count[si] ;увеличиваем соответств. Счетчик
NC: inc BX ;получить очередной символ строки
loop BB
;Вывод результатов
lea DX, OUTSTR
Xor si, si ;Счетчик цифр
OO: xor AX, AX
mov AL, '0'
add AX, SI ;ASCII-код очередной цифры вSI
mov OUTSTR+2, AL ; в буфер вывода
mov AL, COUNT[SI] ;AL<-значение счетчика
; очередной цифры
mov CL, 4 ;получаем
shr AL, CL ; вDI
mov DI, AX ; значение старшей шестн. цифры
mov AL, CIFR[DI] ; счетчика преобразуем вASCII-код
mov OUTSTR+4, AL ;пересылаем в буфер вывода
mov AL, COUNT[SI] ;AL<-знач. счетчика очередн. цифры
and AL, 0Fh ;Получаем вDI значение
mov DI, AX ; младшей шестн. цифры счетчика
mov AL, CIFR[DI] ; преобразуемASCII-код
mov OUTSTR+5, AL ; пересылаем в буфер вывода
mov AH, 09h ;Вывод сформированной в буфере