Лабораторная работа №43 / 4
.docМинистерство Образования и Науки Российской Федерации
Санкт-Петербургский Электротехнический Университет “ЛЭТИ ”
Кафедра МО ЭВМ
Отчет
по лабораторной работе №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-встраивание и использование внешних процедур из подключаемого объектного файла программы на ассемблере).