Файл: 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