- •Таганрог 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. Контрольные вопросы
- •БиблиографИя
- •Содержание
- •Заметки
- •Дроздов Сергей Николаевич Калачев Дмитрий Петрович
3. Пример выполнения работы
В разделе приведен пример ассемблерной подпрограммы, выполняющей подсчет количества символов и количества строк (в смысле последовательность символов, завершающаяся \n) в строке (массиве символов), завершающейся нулевым байтом. Пример представлен в двух вариантах: с интерфейсом Pascal и C.
3.1. Интерфейс Pascal
Файл: COUNT.PAS
program Count;
{$L count.obj}
const StringToCount = 'Строка 1'+#10+'Строка 2'+#10+'Строка3';
var
LCount : integer;
CCount : integer;
function LineCount(
StringToCount:string;
var CharacterCountPtr:integer):integer;external;
Begin
LCount := LineCount(StringToCount,CCount);
writeln('Стpок:',LCount);
writeln('Символов:',CCount);
End.
Файл: COUNT.ASM
;Действие:
; подсчет количества символов и количества строк (в смысле -
; последовательность символов, завершающаяся \n)
; в строке (массиве символов), завершающейся нулевым байтом
;
;Интерфейс:
; Borland Pascal, модель- small
; function LineCount(
; TestString:string;
; var CharacterCountPtr:integer):integer;external;
;
;Параметры и возвращаемые значения:
; StringToCount - указатель на строку, в которой выполняется подсчет
; CharacterCountPtr - указатель на переменную - количество символов
; возвращает - количество строк
;
NEWLINE equ 0Ah ;LF - символ новой строки
dosseg
model SMALL
codeseg
public LineCount
LineCount proc
push BP ;+пролог
mov BP, SP
push SI
push DS ;-пролог
xor CX, CX
mov DS,[BP + 10]
mov SI,[BP+8] ;DS:SI - указатель на длину входной строки
mov CL,[SI] ;счетчик символов
Inc si ;указатель на входную строку
xor DX, DX ;счетчик строк
xor BX, BX ;счетчик символов
LineCountLoop:
lodsb ;очередной символ входной строки вAL
and AL, AL ;а не нулевой ли это символ?
jz EndLineCount ;да, конец входной строки
inc BX ;нет, увеличиваем счетчик символов
cmp AL, NEWLINE ;а не символ ли это новой строки?
jnz EndLoop ;нет, продолжаем просмотр строки
inc DX ;да, увеличиваем счетчик строк
EndLoop:
loop LineCountLoop
EndLineCount:
cmp byte ptr [SI-2], NEWLINE ;есть ли в хвосте символLF
je NoLastLine ;есть, не будем увеличивать счетчик строк
inc DX ;нет, будем увеличивать счетчик строк
NoLastLine:
mov CX, BX ;CX = BX сохраняемBX вCX
mov DS,[BP+6]
mov BX,[BP+4] ;DS:BX - указатель на счетчик символов
mov [BX],CX
mov AX, DX ;возвращаемое значение - счетчик строк
pop DS ;+эпилог
pop SI
pop BP
ret 8 ;-эпилог
LineCount ENDP
end
3.2. Интерфейс C
Файл: COUNT.CPP
/*
Файл:
COUNT.CPP
Действие:
Тестирование ассемблерной функции LineCount (файл: COUNT.ASM)
Модель: small
*/
#include <stdio.h>
char * TestString="Строка1\nСтрока2\nСтрока3\n";
extern unsigned int LineCount(
char * StringToCount,
unsigned int * CharacterCountPtr );
void main()
{
unsigned int LCount;
unsigned int CCount;
LCount = LineCount(TestString, &CCount);
printf("Строк: %d\nСиволов: %d\n", LCount, CCount);
}
Файл: COUNT.ASM
;Файл:
; COUNT.ASM
;Действие:
; подсчет количества символов и количества строк (в смысле -
; последовательность символов, завершающаяся \n)
; в строке (массиве символов), завершающейся нулевым байтом
;Интерфейс:
; Borland C++ v.3.1, модель- small
; extern unsigned int LineCount(
; char * StringToCount,
; unsigned int * CharacterCountPtr);
;Параметры и возвращаемые значения:
; StringToCount - указатель на строку, в которой выполняется подсчет
; CharacterCountPtr - указатель на переменную - количество символов
; возвращает - количество строк
;
NEWLINE equ 0Ah ;LF - символ новой строки
dosseg
model SMALL
codeseg
public _LineCount
_LineCount proc
push BP ;+пролог
mov BP, SP
push SI ;-пролог
mov SI,[BP+4] ;DS:SI - указатель на входную строку
sub CX, CX ;счетчик символов
mov DX, CX ;счетчик строк
LineCountLoop:
lodsb ;очередной символ входной строки вAL
and AL, AL ;а не нулевой ли это символ?
jz EndLineCount ;да, конец входной строки