lab4 / report_lr4
.doc
МИНОБРНАУКИ РОССИИ
Санкт-Петербургский государственный
электротехнический университет
«ЛЭТИ» им. В.И. Ульянова (Ленина)
Кафедра МОЭВМ
отчет
по лабораторной работе №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;
}