Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
11
Добавлен:
01.05.2014
Размер:
87.55 Кб
Скачать

Министерство Образования и Науки Российской Федерации

Санкт-Петербургский Электротехнический Университет “ЛЭТИ ”

Кафедра МО ЭВМ

Отчет

по лабораторной работе №4

“Изучение программирования обработки символьной

информации с использованием команд пересылки строк”

по дисциплине

“Организация и функционирование аппаратных и

программных средств ЭВМ”

Выполнил ст.гр.3342 Смирнов Е.А.

Проверил Красюк В.И.

Санкт-Петербург

2005 г.

Лабораторная работа №4

“Изучение программирования обработки символьной

информации с использованием команд пересылки строк”

Задание:

1.Разработать программу обработки символьной информации, реализующую функции:

- инициализация ( вывод титульной таблички );

- передача строки символов, длиной не более Nmax, из заданной области памяти в буферную область;

- выполнение заданного преобразования введенной строки (формирование выходной строки только из цифр введенной строки), вывода результирующей строки символов на экран и передача в приемную область памяти.

2.Разработать на языке Pascal тестирующую программу для проверки функционирования ассемблерной программы. Ассемблерную программу включить в программу на Pascal по принципу встраивания (in-line).

Текст программы на ассемблере:

.model small

.stack 100h

.data

greeting db ' Лабораторная работа №4',0Ah,0Dh

greeting2 db ' по дисциплине',0Ah,0Dh

greeting3 db ' "Организация и функционирование аппаратных и',0Ah,0Dh

greeting4 db ' программных средств ЭВМ"',0Ah,0Dh,'$'

wait_mes db 'Нажмите любую клавишу...$'

string db '123as7gfd324hgd723'

str_len=$-string

out_str db ?

mes1 db 'Первоначальная строка: $'

mes2 db 'Строка без символов: $'

mes2_len=$-mes2

.code

mov ax, @data

mov ds,ax

mov ax, 0003h ;очистка экрана

int 10h

;------------------------------------

mov ah, 2 ;установка курсора

mov bh, 0

mov dh, 9

mov dl, 0

int 10h

mov dx, offset greeting

mov ah, 9

int 21h

;------------------------------------

mov ah, 2 ;установка курсора

mov bh, 0

mov dh, 24

mov dl, 27

int 10h

mov dx, offset wait_mes

mov ah, 9

int 21h

mov ah,8 ;задержка

int 21h

mov ax, 0003h ;очистка экрана

int 10h

;====================================

; mov ax, 0B800h

; mov es, ax

xor di, di

mov ax, seg string

mov ds, ax

xor si, si

mov si, offset string ;строка находится в ds:[si]

mov cx, str_len ;в cx длина строки

next:

mov ax,ds:[si] ;загрузить в ax следующий символ

cmp al, 30h ;если он >=0

jge g_e ;то

jmp cont ;иначе не записывать -> на следующий символ

g_e:

cmp al, 39h ;если он <=9

jg cont ;то

stosb

cont:

inc si ;записать в выходную строку

loop next

jmp out_

out_:

;================================================

; Вывод первоначальной строки

;================================================

mov ah,2 ;положение курсора

mov bh,0

mov dh,2

mov dl,5

int 10h

mov dx,offset mes1

mov ah,09

int 21h

mov ah,40h

mov bx, 2 ;в STDERR

mov dx, offset string

mov cx, str_len

int 21h

;================================================

; Вывод строки без символов

;================================================

mov ah,2 ;положение курсора

mov bh,0

mov dh,4

mov dl,5

int 10h

mov dx,offset mes2

mov ah,09

int 21h

mov bp, 0

mov ah, 13h

mov al, 0

mov bl, 7

mov dh, 4

mov dl, 5+mes2_len-1

mov cx, di

int 10h

;====================================

mov ah,8 ;задержка

int 21h

mov ax, 0003h ;очистка экрана

int 10h

mov ah, 4ch ;выход

int 21h

end

Программа на Pascal (inline-встраивание):

uses crt;

var max,er:integer;

str_,out_s:string;

answer:char;

procedure print_str(s:string;x,y:byte); {Процедура вывода строки в определенную

позицию на экране}

begin

asm

push bp

push di

cld

lea si,s {загружаем в si строку}

SEGSS lodsb {загружаем в ax символ (длину строки) из ss:si}

xor ah,ah

xor bh,bh

xchg ax,cx {в cx длина строки}

push cx

segss rep movsb {копируем из ss:si в es:di}

pop cx

pop di

mov al,0 {выводим строку на экран через ф-ию 13h

прерывания 21h}

mov dh,y

mov dl,x

mov bl,00000111b

mov bp,di

mov ah,13h

int 10h

pop bp

end

end;

function transform(S: String): String;

begin

asm

push di

cld

mov er,0

lea si,S {загружаем в si строку}

les di,@Result {загружаем в es:di указатель на результат функции}

SEGSS lodsb {загружаем в ax символ (длину строки) из ss:si}

Stosb {копируем байт в строку}

xor ah,ah

xor bh,bh

xchg ax,cx {в cx длина строки}

jcxz @out_

cmp cx,max {сравнение с максимальным числом символов в строке}

jg @error

@next:

SEGSS lodsb {загружаем в ax следующий символ}

cmp al,30h {если он >=0}

jge @g_e {то}

jmp @cont {иначе не записывать -> на следующий символ}

@g_e:

cmp al,39h {если он <=9}

jg @cont {то}

inc bh {увеличить число символов в выходной строке}

stosb {записать в выходную строку}

@cont:

loop @next

jmp @out_

@error:

mov er,1

@out_:

pop di

les di,@Result {записать в первый байт результирующей строки число}

mov al,bh {символов}

stosb

end;

end;

procedure About;

begin

clrscr;

print_str('Лабораторная работа №4',28,9);

print_str('по дисциплине',32,10);

print_str('"Организация и функционирование аппаратных',18,11);

print_str('и программных средств ЭВМ"',26,12);

print_str('Для продолжения нажмите ENTER...',25,24);

repeat

answer:=readkey

until answer=#13;

end;

procedure process;

begin

repeat

clrscr;

writeln;

write(' Введите максимальное число символов: ');readln(max);

writeln;

write(' Введите строку символов длиной не более ',max,' символов: ');readln(str_);

writeln;

out_s:=transform(str_);

if er=1 then writeln(' Длина строки не должна превышать ',max,' символов!')

else writeln(' Строка,состоящая только из цифр исходной строки: ',out_s);

writeln;

writeln(' ==========================================================');

writeln;

writeln (' -=Продолжить?(1-да/2-нет)=- ');

repeat

answer:=readkey

until ((answer='1')or (answer='2'))

until answer='2';

end;

begin

max:=2;

about;

process;

end.

Программа на языке Pascal, использующая внешнюю функцию

(подключение объектного файла ассемблера):

Program Test;

uses crt;

var str_,out_s:string;

answer:char;

max:byte;

er:byte;

{$F+}

function transform(s:string) : string;external;

{$L lr4.OBJ}

{$F-}

begin

repeat

clrscr;

writeln;

write(' Введите максимальное число символов: ');readln(max);

writeln;

write(' Введите строку символов длиной не более ',max,' символов: ');readln(str_);

writeln;

out_s:=transform(str_);

if er=1 then writeln(' Длина строки не должна превышать ',max,' символов!')

else writeln(' Строка,состоящая только из цифр исходной строки: ',out_s);

writeln;

writeln(' ==========================================================');

writeln;

writeln (' -=Продолжить?(1-да/2-нет)=- ');

repeat

answer:=readkey

until ((answer='1')or (answer='2'))

until answer='2';

end.

Подключаемый объектный файл на ассемблере:

DATA SEGMENT WORD PUBLIC

ASSUME DS:DATA

s equ dword PTR ss:[bp+6]

resultPtr equ dword ptr ss:[bp+10]

extrn er : word

extrn max : word

DATA ENDS

CODE SEGMENT BYTE PUBLIC

ASSUME CS:CODE

transform proc far

Public transform

;=====================================================================

mov dx, ds

push bp

mov bp, sp

lds si, s

mov ds:er, 0

push di

les di, resultPtr

stosb

mov al, ds:[si]

xor bh, bh

xor ah, ah

xchg ax, cx

cld

inc si

cmp cx,ds:max

jg error

next:

mov ax,ds:[si]

cmp al, 30h

jge g_e ;then

jmp cont ;else

g_e:

cmp al, 39h

jg cont ;then

inc bh

stosb

cont:

inc si

loop next

jmp out_

error: mov ds:er, 1

out_:

pop di

les di, resultptr

mov al, bh

stosb

mov ds,dx

pop bp

ret 4

;=====================================================================

transform endp

code ends

end

Вывод:

В данной лабораторной работе я познакомился с командами обработки символьной информации и их использованием, а также с организацией связи программы на ассемблере с ЯВУ (inline-встраивание и использование внешних процедур из подключаемого объектного файла программы на ассемблере).