Файл: 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;да, конец входной строки
inc CX;нет, увеличиваем счетчик символов
cmp AL, NEWLINE;а не символ ли это новой строки?
jnz LineCountLoop;нет, продолжаем просмотр строки
inc DX;да, увеличиваем счетчик строк
jmp LineCountLoop
EndLineCount:
cmp byte ptr [SI-2], NEWLINE;есть ли в хвосте символ LF
je NoLastLine;есть, не будем увеличивать счетчик строк
inc DX;нет, будем увеличивать счетчик строк
NoLastLine:
mov BX,[BP+6];BX - указатель на счетчик символов
mov [BX],CX;
mov AX, DX;возвращаемое значение - счетчик строк
pop SI;+эпилог
pop BP
ret;-эпилог
_LineCount ENDP
END
ВАРИАНТЫ ЗАДАНИЙ
Во всех заданиях следует разработать некоторую подпрограмму на ассемблере с интерфейсом Pascal или C и вызывающую программу, на соответствующем языке. Вызывающая программа должна демонстрировать работоспособность ассемблерной подпрограммы. Если в задании язык не указан, то можно выбрать любой.
1. Разработать подпрограмму на ассемблере, которая выполняет пересылку указанного числа байт. Адреса источника и приемника – параметры. Подпрограмма должна возвращать количество пересланных байт.
2. Разработать подпрограмму на ассемблере, которая выполняет обмен указанного числа байтов. Адреса областей памяти – операндов должны быть переданы как параметры. Подпрограмма должна возвращать количество перемещенных байтов.
3. Разработать подпрограмму на ассемблере, которая определяет и возвращает номер первого установленного бита в массиве байтов. Адреса массива и его размер должны быть переданы как параметры.
4. Разработать подпрограмму на ассемблере для определения длины строки. Адрес строки – параметр. Подпрограмма должна возвращать длину строки.
5. Разработать подпрограмму на ассемблере для сравнения строк (аналог функции strcmp языка C). Адрес строки – параметр. Подпрограмма должна возвращать длину строки. Язык – C.
6. Разработать подпрограмму на ассемблере для сравнения строк (аналог функции strcnmp языка C). Адрес строки – параметр. Подпрограмма должна возвращать длину строки. Язык – C.
7. Разработать подпрограмму, которая определяет, содержится ли одна заданная строка в другой заданной строке, и если да, то, начиная с какой позиции. Разработать программу, которая вводит с клавиатуры две строки и сообщает, содержится ли одна из них в другой и сколько раз. Язык – C.
8. Разработать подпрограмму, которая подсчитывает, сколько раз заданный символ встречается в строке. Разработать программу, которая вводит с клавиатуры строку, вводит число N и выдает список символов, которые встречаются в строке не менее чем N раз. Язык – C.
9. Разработать две подпрограммы, одна из которых соединяет две строки в одну, а другая обрезает строку до заданной длины (или дополняет пробелами, если длина строки меньше заданной). Разработать программу, которая вводит с клавиатуры число N, затем вводит несколько строк (конец ввода – пустая строка) и формирует новую строку, состоящую из первых N символов каждой введенной строки.
10. Разработать подпрограмму, которая разбивает заданную строку на две части: первое слово строки (до первого пробела) и остаток строки (пробелы после первого слова отбрасываются).
11. Разработать подпрограмму, которая определяет, содержится ли одна заданная строка в другой заданной строке, и если да, то, начиная с какой позиции. Язык – Pascal.
КОНТРОЛЬНЫЕ ВОПРОСЫ
1. Что означает понятие «соглашение о связях»?
2. Каким образом осуществляется передача параметров по ссылке и по значению?
3. Что такое «выравнивание полей структур на границу...»?
4. Каким образом осуществляется возврат значений в функциях?
БИБЛИОГРАФИя
1. Сван Т. Освоение Turbo Assembler. К: Диалектика, 1996. 544 с.
2. Скэнлон Л. Персональные ЭВМ IBM PC и AT. М.:Радио и связь, 1989. 336с.
3. Брэдли Д. Программирование на языке ассемблера для персональной ЭВМ фирмы IBM. М.:Радио и связь, 1988. 448с.
4. Шнайдер А. Язык ассемблера для персонального компьютера фирмы IBM. М.:Мир, 1988. 406с.
5. Лю Ю-Чжен, Гибсон Г. Микропроцессоры семейства 8086/8088. Архитектура, программирование и проектирование микрокомпьютерных систем. М.:Радио и связь, 1987. 512с.
6. Нортон П. Персональный компьютер фирмы IBM и операционная система MS-DOS. М.:Радио и связь, 1991. 416с.
7. Mixed-Language Programming Guide. Document No. 410840031-500-R01-1287. Microsoft Corp., 1987.