Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методичка по МО.doc
Скачиваний:
47
Добавлен:
01.06.2015
Размер:
353.79 Кб
Скачать

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