Интерфейс 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;да, конец входной строки

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.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: