На этапе постановки задачи были поставлены следующие условия:
Создать Windows-приложение на языке Ассемблер.
Далее нужно было выбрать номер варианта задания:
Номер задания равен: (N % 43) + 1, где N – номер зачетки (в данном случае 100046).
Сделав приведенные выше вычисления, получили вариант №29.
Текст варианта задания: Сделать программу преобразователь текста.
Исходный код программы
.386
Model flat, stdcall
Option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
Data
conTitle DB " Convert to program", 0;задаем текст окна
mes1 DB " Before: ",0;в mes1 переменую записуем слово
len_mes1 EQU $-mes1
mes2 DB " After: ", 0;в переменую mes2 записуем слово
len_mes2 EQU $-mes2
S1 DB "hello word!",0dh,0ah,0;вводим строку для конвертирования
LS1 EQU $-S1
charBuf DB " ",0
len_charBuf DD $-charBuf
ReadBuf DB?
LenReadBuf DD 1
HStdIn DD 0
HStdOut DD 0
ChrsRead DD 0
ChrsWritten DD 0
STD_INP_HNDL DD -10
STD_OUTP_HNDL DD -11
Code
start:
Call AllocConsole;вызов консоли
Test eax, eax;логическая И с eax
Jz ex;переход на ex
Push offset conTitle;задаем титульное заглавие
Call SetConsoleTitleA;изменяем название консоли
Test eax, eax;логическая И
Jz ex;переход на ex
Call getout_hndl;вызов getout_hndl
Call getinp_hndl;вызов getinp_hndl
Push EBX;задаем EBX
Mov EBX, offset mes1;записуем в EBX mes1
Mov ECX, len_mes1;в ECX записуем длину mes1
Call write_con;добавляем консоль
Pop EBX;меняем значение EBX старое знач. утрачиваеться
Push EBX;изменяем EBX
Mov EBX, offset S1;записуем в EBX строку которую будем конвертировать
Mov ECX, LS1;в ECX записуем длину строки S1
Call write_con;добавляем в консоль
Pop EBX;меняем значение EBX старое знач. утрачиваеться
Push EBX;изменяем EBX
Mov EBX, offset mes2;записуем в EBX строку mes2
Mov ECX, len_mes2;записуем в ECX длину mes2
Call write_con;добавляем в консоль
Pop EBX;меняем значение EBX старое знач. утрачиваеться
Lea ESI, dword ptr S1;в ESI содержит указатель на S1
Mov ECX, dword ptr LS1;в ECX помещаем длину S1
next:
mov AL, BYTE PTR [ESI];записуем в AL байтовое значение ESI
Cmp al, 'a';сравниваем AL с буквой
Jb next_addr;переход на метку next_addr
Cmp AL, 'z';сравниваем AL с буквой
Ja next_addr
And AL, 0dfh;логическое умножение между AL и 0dfh строчные в заглавные
mov BYTE PTR [ESI], AL;записуем баутовое значение ESI в AL
next_addr:
Inc ESI;ESI увеличим на 1
Loop next;повторить next
Push EBX;изменяем EBX
Mov EBX, offset S1;записуем в EBX S1
Mov ECX, LS1;записуем в ECX длину S1
Call write_con;добавляем в сонсоль
Pop EBX;меняем значение EBX старое знач. утрачиваеться
Call read_con;редактируем консоль
ex:
Push 0
Call ExitProcess;закрываем процес
;------ functions ----
Getout_hndl proc;getout_hndl процесс
Push STD_OUTP_HNDL;изменяем STD_OUTP_HNDL
Call GetStdHandle;добавляем GetStdHandle
Mov hStdOut, eax;в hStdOut записуем eax
Ret;уменьшение указателя стека на 2
Getout_hndl endp;закрываем процесс
Getinp_hndl proc
Push STD_INP_HNDL
Call GetStdHandle
Mov hStdIn, eax
Ret
Getinp_hndl endp
Write_con proc
push 0;lpReserved = NULL
Push chrsWritten;число байтов написаны на StdOut
Push ECX
Push EBX
Push hStdOut
Call WriteConsoleA
Ret
Write_con endp
Read_con proc
push 0;lpReserved = NULL
Push chrsRead
Push lenReadBuf
Push offset readBuf
Push hStdIn
Call ReadConsoleA
Ret
Read_con endp
;-------------------
End start
Выводы
В ходе выполнения курсовой работы было получено работоспособное Windows-приложение в результате выполнения которого программа, по вводу строки может изменять буквы нижнего регистра в буквы верхнего регистра. Данная программа может быть использована, как уже указывалось ранее, для преобразования текста. Разработанная программа соответствует всем условиям, поставленным на этапе постановки задачи.
Список использованных источников
1. Ю. С. Магда «Ассемблер. Разработка и оптимизация Windows-приложений», СПб, 2003 г.
2. В. В. Пирогов «Ассемблер на примерах», СПб, 2005 г.
3. В. И. Юров «Assembler» 2-е, 3-е издания, СПб, 2003, 2010 гг.
4. Уроки по Ассемблеру. https://bitfry.narod.ru/
5. Юров В.И. «Assembler. Учебник для вузов», Питер, 2-е издание, 2003 г.
6. О. А. Калашников «Ассемблер — это просто. Учимся программировать», БХВ-Петербург, 2011 г.