Конкатенація строк Assembler

Курсовой проект - Компьютеры, программирование

Другие курсовые по предмету Компьютеры, программирование

ВСТУП

 

Метою курсової роботи було отримання необхідних навичок для програмування на машино-орієнтованій мові Асемблер. У перший частині роботи згідно за варіантом завдання були розроблені граф-схеми алгоритмів, які допомогли наглядно представити задачу, розбити її на декілька менших задач та опанувати логіку завдання, що дало змогу перейти до розробки кода, тобто до другої частини. При розробці кода був використан компілятор MASM32 v8.2. Полний код програми можна побачити у додатку до курсової роботи. Також приведено пояснення коду, якщо його опанування викликало якісь труднощі та примір роботи функції зі скріншотами. Інструкція користувача дає знання як коректно ввести результати та отримати правильний результат.

 

1 ПРОГРАМА ДЛЯ АРИФМЕТИЧНИХ ОБЧИСЛЕНЬ

 

  1. Граф-схема алгоритму обчислювання функції

 

Так як я маю тринадцятий номер за журналом, то моєму варіанту відповідає наступна система:

 

,если a > b

Y =2,если a = b

,если a < b

 

Згідно цього розробляється ГСА алгоритму, яка буде показувати необхідну реалізацію(Рис 1.1).

 

Рис. 1.1

1.2 Граф-схема алгоритму строкової функції

 

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

"Ввести 2 строки символов. Произвести их конкатенацию (объединение)."

Для цього завдання була разраблона граф-схема, яка представлена на рис 1.2.

 

Рис 1.2

 

  1. . РЕАЛІЗАЦІЯ ПРОГРАМИ

 

  1. Опис коду програми

 

На основі алгоритмів, яки були приведені у пункті 1 був розроблен код, який послідовно обробляє дві функції, тобто спочатку математичну, а потім строкову. Арифметична функція називається arithm, а строкова string, але спочатку про код програми. Програма починається з

 

.486

.model flat, stdcall

option casemap :none

include \masm32\include\windows.inc

include \masm32\macros\macros.asm

include \masm32\include\masm32.inc

include \masm32\include\gdi32.inc

include \masm32\include\user32.inc

include \masm32\include\kernel32.inc

include \masm32\include\fpu.inc

includelib \masm32\lib\masm32.lib

includelib \masm32\lib\gdi32.lib

includelib \masm32\lib\user32.lib

includelib \masm32\lib\kernel32.lib

includelib \masm32\lib\fpu.lib

 

Цей код визначає інструкції, які може використовувати компялітор під час створення низькорівневого коду програми. Директива include визначає які бібліотекі необхідно підключити, щоб програма могла користуватися необхідними функціями. На приклад, include \masm32\include\fpu.inc має значення, тому використовуються математичні функції сопроцесора. Докладніший опис бібліотек можна знайти у інструкції компілятора.

Наступним йде оголошення сегменту ініціалізованих та не ініціалізованих даних, тобто констант та змінних, які використовують у програмі.

 

.data

strNum1 db "Type the the first number: ", 0

strNum2 db "Type the second number: ", 0

strArithm db "The result of fucntion: ", 0

strType1 db "Type the first string: ", 0

strType2 db "Type the second string: ", 0

strResult db "The result of concationation: ", 0

strZeroDiv db "Zero divide is forbidden. Function is undefined ", 13, 10

cons dq -2.0

one dq 1.0

y dq 0

.data?

buff db 128 dup(?)

str1 db 64 dup(?)

str2 db 64 dup(?)

a dq ?

b dq ?

 

На приклад, strNum1 db "Type the the first number: ", 0 це строка, яка ініціалізована текстом, та має свій розмір. Кожен символ цієї строки має розмір 1 байт. a dq ? Показує також, що у програмі використовується змінна, яка має розмір 4 слова та не визначена, тому що це не біло необхідно. Наступним йде сегмент коду, він починається з мітки start:, у ньому визивається функція математичного обчислювання arithm, print chr$(13, 10) робе перевод строки, а call string визиває строкову функцію, тобто її реалізацію. Функція arithm починається з

 

arithm proc

LOCAL hInput :DWORD

LOCAL hOutPut :DWORD

LOCAL nRead1 :DWORD

LOCAL nRead2 :DWORD

LOCAL str3[15] :BYTE

 

arithm proc є оголошенням функція, тобто текстом, який каже, зо почалась функція, яка має бути викликаною десь у коді. Наступний текст оглошення локальних змінних, що є особливістю компілятора. Тільки у MASM 32 можна створити локальні змінні, які розташовуються у стеку. Доступ до цих змінних виконується за допомогою ADDR, тобто макроса, який повертає їх адрес розташування у стеку. Також хочеться особливо відмітити LOCAL hInput :DWORD . Ця змінна потрібна, щоб організувати консольний ввод змінних та строк. Розмір змінної два слова. Змінна LOCAL hOutPut :DWORD також тримає хендл, але для консольного вивода. Змінні LOCAL nRead1 :DWORD LOCAL nRead2 :DWORD мають однакове призначення, тобто воні використовують у однієї і тієїж функції. У них записується результат зчитування строки з консолі, тобто кількість байт, яка була прочитана.

Для того щоб реалізувати вивод та ввод у програмі потрібно спочатку отримати хендли для ввода та вивода, тобто проініціалізувати змінні LOCAL hOutPut :DWORD LOCAL hInput :DWORD. Це робиться завдяки

 

invoke GetStdHandle, STD_OUTPUT_HANDLE

mov hOutPut, eax

invoke GetStdHandle, STD_INPUT_HANDLE

mov hInput , eax

 

Функція GetStdHandle , яка отримає аргумент STD_OUTPUT_HANDLE розташовує у регістрі eax хендл для вивода тексти у консоль. mov hOutPut, eax ініціалізує змінну hOutPut. Такая ж операція робиться для hInput але з метою отримати хендл для вивода.

 

invoke szLen, offset strNum1

invoke WriteConsole, hOutPut, offset strNum1, eax, NULL, NULL

invoke ReadConsole, hInput , ADDR str1, 10d, ADDR nRead1, NULL

 

Функція szLen отримує як аргумент строку з сегменту даних, щоб знайти її длину, яка розташовуєть у регістрі eax. Функція WriteConsole використовується для вивода на консоль. Нижче приведен її прототип, взяти з MSDN.

 

BOOL WriteConsole(

HANDLE hConsoleOutput, // handle to screen buffer

CONST VOID *lpBuffer, // write buffer

DWORD nNumberOfCharsToWrite, // number of characters to write

LPDWORD lpNumberOfCharsWritten, // number of characters written

L