Язык ассемблера. Обработка символьных данных

Автор: Пользователь скрыл имя, 07 Декабря 2011 в 02:53, лабораторная работа

Краткое описание

Задание: Дан текст – непустая последовательность не длиннее ста символов. Признаком конца ввода является точка, в сам текст точка не входит. Проверить, удовлетворяет ли текст заданному условию: за каждой цифрой текста идет строчная латинская буква. Если условие выполнено, преобразовать текст по одному правилу: заменить каждую прописную русскую букву симметричной ей в алфавите (А ↔ Я, Б ↔ Ю, ...), в противном случае – по другому правилу: в каждой группе следующих подряд одинаковых литер оставить только одну из них (использовать строковые команды с префиксами повторения). Преобразованный текст напечатать.

Файлы: 1 файл

lab2asm.doc

— 168.00 Кб (Скачать)

Министерство  образования Республики Беларусь

Учреждение  образования 

Брестский государственный технический университет

Кафедра ИИТ 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

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

Тема: «Язык ассемблера. Обработка символьных данных» 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

                           Выполнил:

                           студент 4 курса

                           факультета ЭИС

                           группы АС-27

                           Якубчик Н.И. 

                           Проверил:

                                   Дёмин  В.В.  
                   
                   
                   
                   

    Брест  2011

Вариант 9.

Задание: Дан  текст –  непустая  последовательность  не  длиннее  ста  символов.  Признаком  конца ввода является точка, в сам текст точка не входит.  Проверить,  удовлетворяет  ли  текст  заданному  условию: за каждой цифрой текста идет строчная латинская буква.  Если  условие  выполнено, преобразовать  текст  по  одному  правилу: заменить каждую прописную русскую букву симметричной ей в алфавите (А ↔ Я, Б ↔ Ю, ...),  в  противном  случае –  по  другому  правилу: в каждой  группе  следующих подряд одинаковых литер оставить  только одну из них (использовать  строковые команды с префиксами повторения). Преобразованный текст напечатать. 

     Если  введенная последовательность  символов не  является  текстом, преобразовывать  ее не нужно, а следует напечатать соответствующее сообщение.

     Ввод  текста,  проверка  условия,  обработка  текста  и  печать  результата  должны выполняться последовательно, отдельными частями программы.  

Код программы:

#include "stdafx.h"

#include <iostream> 

using namespace std; 

const int len_str = 100;      

bool is_a_text (char my_string[])   

{

      __asm

      {

            mov ebx, dword ptr [my_string]

            mov al, byte ptr [ebx]

            mov ah, 0

start_cycle:       ;Проверка в цикле, нет ли в строке

            cmp al, 0     ;символов с кодами 1-31, 33-46, 47,

            je string_more_max    ;58-64, 91-96, 123-127, 176-223,

            cmp al, 46     ;240-255

            je end_of_string

            cmp al, 32

            je is_a_char

            cmp al, 48

            jb not_a_string

            cmp al, 58

            jb is_a_char

            cmp al, 65

            jb not_a_string

            cmp al, 91

            jb is_a_char

            cmp al, 97

            jb not_a_string

            cmp al, 123

            jb is_a_char

            cmp al, 128

            jb not_a_string

            cmp al, 176

            jb is_a_char

            cmp al, 224

            jb not_a_string

            cmp al, 242

            jb is_a_char

            jmp not_a_string

is_a_char:      ;переход к следующему символу

            cmp ah, 99

            je string_more_max

            inc ebx

            inc ah

            mov al, byte ptr [ebx]

            jmp start_cycle

string_more_max:     ;Обработка случая, если строка

            mov byte ptr[ebx], 46  ;заканчивается не точкой

            mov byte ptr[ebx+1], 0

end_of_string:     ;Возврат логического значения

            mov al, 1    ;в точку вызова функции

            jmp end_my_proc

not_a_string:

            mov al, 0

end_my_proc:

      }

} 

bool proverka(char my_string[])   

{

      __asm

      {

            mov ebx, dword ptr [my_string]  ;посимвольная проверка

            mov ah, byte ptr [ebx]

            mov al, 1

start_cycle:

            cmp ah, 46     ;не конец строки?

            je end_my_proverka

            cmp ah, 48     ;не цифра?

            jb not_a_digit

            cmp ah, 57

            ja not_a_digit

            mov ah, byte ptr [ebx+1]   ;следующий символ - не

            cmp ah, 96     ;строчная латинская буква?

            jb condition_false

            cmp ah, 123

            ja condition_false

not_a_digit:       ;переход к следующему символу

            inc ebx       

            mov ah, byte ptr [ebx]   

            jmp start_cycle

condition_false:      ;если условие хоть раз нарушается -

            mov al, 0     ;возврат в точку вызова "Ложь"

end_my_proverka:      ;иначе - возврат "Истина"

      }

} 

void first_rule(char my_string[])  

{

      __asm

      {

            mov ebx, dword ptr [my_string]

            mov al, byte ptr [ebx]

start_cycle:

            cmp al, 46    ;конец строки - на выход

            je end_first_rule

            cmp al, 128   ;симметричная замена РУССКИХ ПРОПИСНЫХ букв

            jb next_char  

            cmp al, 159

            ja next_char

            cmp al, 145

            jb another_method

            mov ah,159

            sub ah, al

            mov al, 128

            add al, ah

            mov byte ptr [ebx], al

            jmp next_char

another_method:

            mov ah, al

            sub ah, 128

            mov al, 159

            sub al, ah

            mov byte ptr [ebx], al

next_char:      ;переход к следующему символу

            inc ebx

            mov al, byte ptr [ebx]

            jmp start_cycle

end_first_rule:

      }

} 

void second_rule(char my_string[])  

{

      __asm

      {

            mov ebx, dword ptr [my_string]

            mov al, byte ptr [ebx]

            mov edx, 0

start_counting_cycle:

            cmp al, 0     ;конец строки - на выход

            je end_counting

            inc edx

            inc ebx

            mov al, byte ptr [ebx]

            jmp start_counting_cycle

end_counting:       ;счёт количества символов

            mov ebx, dword ptr [my_string]  ;в строке

            mov al, byte ptr [ebx]

start_cycle:

            cmp al, 46     ;конец строки - на выход

            je end_second_rule

            mov ah, byte ptr [ebx+1]

            xor ah, al

            je obrabotka

            inc ebx

            dec edx

            mov al, byte ptr [ebx]

            jmp start_cycle

obrabotka:       ;если группа символов -

            mov ecx, edx     ;сдвиг строки влево с

            cld      ;затиранием 1 символа

            lea di, byte ptr [ebx]   ;группы

            lea si, byte ptr [ebx+1]

            rep movsb     ;если сдвигали -

            dec edx     ;проверяем по-новой, иначе -

            jmp start_cycle    ;переход на следующий символ

end_second_rule:

                  }

} 

int _tmain(int argc, _TCHAR* argv[])

{

      cout<<"Input string:\n";

      char my_string [len_str+1] ;

      cin>>my_string;      

      if(!is_a_text(my_string))     

      {        

            cout<<"\nThis is not a text\n";   

            cin.get();

            return 0;

      }

      cout<<"Veryfying: after any number comes little latin symbol: "<<endl; 

      //Если  строка соотвествует условию  - преобразование по первому правилу

      //иначе - по второму 

      if (proverka(my_string))

      {

            cout<<"true\nModifying: Any big russian symbol changing by simmetrial:\n";

            first_rule(my_string);

      }

      else

      {

            cout<<"false\nModifying: Changing all groups of symbols on one of them:\n";

            second_rule(my_string);

      }

      cout<<my_string<<"\nPress ENTER to exit";  //Печать полученной строки

      cin.get();

      cin.get();

      return 0;

} 

    Тестирование  программы: 

    Запустим  программу и введём строку, содержащую символы, не соответствующие тексту:

      
 
 
 
 
 
 
 
 
 
 
 
 
 

    Запустим  программу и введём строку, соответствующую условию и позволяющую наглядно преобразовать себя по первому правилу

Информация о работе Язык ассемблера. Обработка символьных данных