Интерфейс 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


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



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