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

lab4 / report_lr4

.doc
Скачиваний:
9
Добавлен:
10.02.2019
Размер:
121.34 Кб
Скачать

МИНОБРНАУКИ РОССИИ

Санкт-Петербургский государственный

электротехнический университет

«ЛЭТИ» им. В.И. Ульянова (Ленина)

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

отчет

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

по дисциплине «Организация ЭВМ и систем»

Тема: Изучение программирования обработки символьной информации с использованием команд пересылки строк.

Студент гр. 3303

Преподаватель

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

2018

Цель работы.

Ознакомиться с обработкой символьной информации с использование команд для пересылки строк в программах на языке Ассемблер.

Постановка задачи.

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

  • инициализация (вывод титульной таблички с указанием вида преобразования и автора программы) - на языке высокого уровня (Pascal или Си);

  • ввода строки символов, длиной не более Nmax (<=80), с клавиатуры в заданную область памяти - на языке высокого уровня;

  • формирование номера введённой русской буквы по алфавиту и номера позиции его первого вхождения во входной строке и выдача их на экран.

  • вывода результирующей строки символов на экран и ее запись в файл - на ЯВУ.

Ассемблерную часть программы включить в программу нa Pascal или Си по принципу встраивания (in-line).

Ход работы.

Была написан программа lab4.cpp. Код программы представлен в приложении A. Программа считывает посимвольно введённую строку, игнорируя буквы отличные от русских, и передаёт её в ассемблерную вставку. Подпрограмма на языке Ассемблера анализирует посимвольно введённую строку и создаёт другую новую строку сохраняя в неё букву, номер её первого вхождения, и позицию в алфавите. После программа выводит результат на экран.

Программа была успешно протестирована, результат на рис. 1

Рисунок 1 – пример работы программы

Вывод:

В ходе данной лабораторной работы я ознакомился с обработкой символьной информации с использование команд для пересылки строк в программах на языке Ассемблер.

Приложение А

Код программы lab4.cpp

#include "pch.h"

#include<Windows.h>

#include<cstdio>

#include<cstdlib>

int main(){

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

const int N = 80; // инициализация переменных

int i = 0;

char* str =(char*) calloc(N,sizeof(char));

char c ;

printf("Автор: Пупкин \n Задание: Формирование номера введенной русской буквы по алфавиту и номера позиции его первого вхождения во входной строке и выдача их на экран\n");

printf("Введите строку: ");

while ( ( c = getchar()) != '\n' ) { //считывание строки с проверкой на русские буквы

if ( ( c >= -64 && c <= -1 )|| c == -72 || c == -88) str[i++] = c;

}

char* str1 = (char*)calloc(i*3, sizeof(char));

__asm {

mov esi, str // в si пометим адрес str

mov edi, str1

mov ecx, i // в счётчик массива положим длину строки

for:

lodsb // кладём байт из si в al

stosb // пересылаем байт из al в di

mov c, 0 // счётчик первого вхождения встроку

mov edx, esi // сохраняем адрес строки

mov bl, al // сохраняем текущий символ

mov esi, str //начало поиска с самого начала исходной строки

lodsb // считывание символа из str

while:

cmp al, bl //сравнение символов

je if // переход если они равны

lodsb // считывание символа

inc c //с++

jmp while //переход пометке

if:

mov al, c // запись номера первого вхождения

stosb // пересылаем номер первого вхождения в di

mov esi, edx // пересылаем начало строки в si

mov al, bl //берём текущий символ из bx

cmp al, 'ё' // проверка на ё

jne ex1 // если не равно - переход

add al, 46 //загружаем смещение для ё

ex1:

cmp al, 'Ё' // проверка на Ё

jne ex2

add al, 30 //загружаем смещение для Ё

ex2 :

add al, 1 // добавочное смещение на 1

cmp al, 'а' // сравнение с буквой а

jge true // переход к прописным буквам

cmp al, 'Е' //проверка на буквы после Е

jbe lab1

add al, 1 // допсмещение для букв после Е

lab1:

sub al, 'А' //смещение для заглавной

jmp end

true :

cmp al, 'е' //проверка на буквы после е

jbe lab2

add al, 1 // допсмещение для букв после е

lab2 :

sub al, 'а' //смещение для прописной

end :

stosb // загрузка числа в строку

loop for

}

int n = i;

printf("Обработанная строка:\n");

for (int i = 0; i < 3 * n; i += 3)//вывод обработанной строки

printf("символ строки:[%c] номер первого вхождения:[%d] номер буквы в алфавите:[%d]\n", str1[i], str1[i + 1], str1[i + 2]);

return 0;

}

5

Соседние файлы в папке lab4