- •Таганрог 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. Команды десятичной коррекции неупакованных чисел
Для неупакованных чисел или, как их еще называют ASCII-чисел, существуют аналогичные команды коррекции после сложения – aaa и вычитания – aas. Сложение и вычитание ASCII-чисел также выполняется в два этапа.
Кроме того, над ASCII-числами допустимо выполнение операций умножения и деления.
Умножение ASCII-чисел выполняется в два этапа:
умножение одноразрядных сомножителей, представленных байтами, в которых младшие тетрады содержат десятичные цифры, а старшие тетрады – нулевые. Умножение выполняется командой mul, которая формирует в регистре AL двоичное произведение;
коррекция результата с помощью команды aam, которая преобразует полученный результат в двухбайтовое произведение, находящееся в регистрах AH (старший десятичный разряд) и AL (младший разряд).
Деление также выполняется в два этапа, но в отличие от остальных команд коррекция выполняется не после, а перед выполнением операции:
коррекция делимого с помощью команды aad, которая предполагает, что в регистрах AH и AL находится двухразрядное делимое, причем AH содержит цифру десятков, а AL – цифру единиц и обе старшие тетрады нулевые. Она формирует в AX соответствующее двоичное число;
деление полученного в AX делимого на одноразрядный делитель, с получением частного в AL и остатка в AH.
3. Пример выполнения работы
Написать программу сложения двух десятиразрядных неупакованных десятичных чисел.
Текст программы:
model SMALL
stack 100h
dataseg
Ask1 db 0Ah,0Dh,'Введите первое слагаемое (не более 10 цифр):$'
Ask2 db 0Ah,0Dh,'Введите второе слагаемое (не более 10 цифр):$'
Buf1 db 11
Len1 db ?
Opnd1 db 12 dup( ? )
Buf2 db 11
Len2 db ?
Opnd2 db 12 dup( ? )
ResT db 0Ah,0Dh,'Сумма'
Res db 12 dup(' '),'$'
AskCont db 0Ah,0Dh
db 'Завершить работу- Esc, продолжить - ЛЮБАЯКЛАВИША'
db '$'
codeseg
startupcode
push DS
pop ES ; ES <- DS
BEGIN:
;Ввод первого слагаемого
B1: lea DX, Ask1
mov AH, 09h
int 21h
lea DX, Buf1
mov AH, 0Ah
int 21h
cmp Len1, 0
je B1
;проверка 0-9 и очистка старш.тетрады
lea BX, Opnd1
xor CX, CX
mov CL, Len1
xor SI, SI
T1: mov AL, [BX][SI]
cmp AL, '0'
jb B1 ; ошибка
cmp AL, '9'
ja B1 ; ошибка
and AL, 0Fh
mov [BX][SI], AL
inc SI
loop T1
;прижать к правому краю
mov CL, Len1
cmp CL, 10
je E1
mov DI, 9
mov SI, CX
dec SI
P1: mov AL, [BX][SI]
mov [BX][DI], AL
dec DI
dec SI
loop P1
;обнулить лишнее
xor DI, DI
mov CL, 10
sub CL, Len1
N1: mov byte ptr [BX][DI], 0
inc DI
loop N1
E1:
;Ввод второго слагаемого
B2: lea DX, Ask2
mov AH, 09h
int 21h
lea DX, Buf2
mov AH, 0Ah
int 21h
cmp Len2, 0
je B2
;проверка 0-9 и очистка старш.тетрады
lea BX, Opnd2
xor CX, CX
mov CL, Len2
xor SI, SI
T2: mov AL, [BX][SI]
cmp AL, '0'
jb B2 ; ошибка
cmp AL, '9'
ja B2 ; ошибка
and AL, 0Fh
mov [BX][SI], AL
inc SI
loop T2
;прижать к правому краю
mov CL, Len2
cmp CL, 10
je E2
mov DI, 9
mov SI, CX
dec SI
P2: mov AL, [BX][SI]
mov [BX][DI], AL
dec DI
dec SI
loop P2
;обнулить лишнее
xor DI, DI
mov CL, 10
sub CL, Len2
N2: mov byte ptr [BX][DI], 0
inc DI
loop N2
E2:
;Сложение
mov CX, 10
clc
lea SI, Opnd1+9
lea DI, Opnd2+9
lea BX, Res+10
A1: mov AL, [SI]
adc AL, [DI]
aaa
mov [BX], AL
dec SI
dec DI
dec BX
loop A1
mov AL, 0
adc AL, 0
mov [BX], AL
;Преобразование результата в ASCII
mov CX, 11
A2: or byte ptr [BX], 30h
inc BX
loop A2
;Вывод результата
lea DX, ResT
mov AH, 09h
int 21h
;Запрос на продолжение работы
lea DX, AskCont
mov AH, 09h
int 21h
mov AH, 08h
int 21h
cmp AL, 27 ;ESC
je QUIT
jmp BEGIN
;Конец работы
QUIT: exitcode 0
end