
Содержание
Содержание 1
Введение 8
Глава 1. Теоретическая часть 9
Использование Ассемблера для разработки Windows-приложений 9
Глава 2. Практическая часть 12
Исходный код программы 13
.386 13
.model flat, stdcall 13
option casemap :none 13
13
include \masm32\include\windows.inc 13
include \masm32\include\user32.inc 13
include \masm32\include\kernel32.inc 13
includelib \masm32\lib\user32.lib 13
includelib \masm32\lib\kernel32.lib 13
13
.data 13
conTitle DB " Convert to program", 0 ;задаем текст окна 13
mes1 DB " Before: ",0 ;в mes1 переменую записуем слово 13
len_mes1 EQU $-mes1 13
mes2 DB " After: ", 0 ;в переменую mes2 записуем слово 13
len_mes2 EQU $-mes2 13
S1 DB "hello word!",0dh,0ah,0 ;вводим строку для конвертирования 13
LS1 EQU $-S1 13
13
charBuf DB " ",0 13
len_charBuf DD $-charBuf 14
14
readBuf DB ? 14
lenReadBuf DD 1 14
14
hStdIn DD 0 14
hStdOut DD 0 14
14
chrsRead DD 0 14
chrsWritten DD 0 14
14
STD_INP_HNDL DD -10 14
STD_OUTP_HNDL DD -11 14
.code 14
start: 14
call AllocConsole ;вызов консоли 14
test eax, eax ;логическая И с eax 14
jz ex ;переход на ex 14
14
push offset conTitle ;задаем титульное заглавие 14
call SetConsoleTitleA ;изменяем название консоли 14
test eax, eax ;логическая И 14
jz ex ;переход на ex 14
15
call getout_hndl ;вызов getout_hndl 15
call getinp_hndl ;вызов getinp_hndl 15
push EBX ;задаем EBX 15
mov EBX, offset mes1 ;записуем в EBX mes1 15
mov ECX, len_mes1 ;в ECX записуем длину mes1 15
call write_con ;добавляем консоль 15
pop EBX ;меняем значение EBX старое знач. утрачиваеться 15
push EBX ;изменяем EBX 15
mov EBX, offset S1 ;записуем в EBX строку которую будем конвертировать 15
mov ECX, LS1 ;в ECX записуем длину строки S1 15
call write_con ;добавляем в консоль 15
pop EBX ;меняем значение EBX старое знач. утрачиваеться 15
push EBX ;изменяем EBX 15
mov EBX, offset mes2 ;записуем в EBX строку mes2 15
mov ECX, len_mes2 ;записуем в ECX длину mes2 15
call write_con ;добавляем в консоль 15
pop EBX ;меняем значение EBX старое знач. утрачиваеться 15
15
lea ESI, dword ptr S1 ;в ESI содержит указатель на S1 15
mov ECX, dword ptr LS1 ;в ECX помещаем длину S1 16
next: 16
mov AL, BYTE PTR [ESI] ;записуем в AL байтовое значение ESI 16
cmp al, 'a' ;сравниваем AL с буквой 16
jb next_addr ;переход на метку next_addr 16
cmp AL, 'z' ;сравниваем AL с буквой 16
ja next_addr 16
and AL, 0dfh ;логическое умножение между AL и 0dfh строчные в заглавные 16
mov BYTE PTR [ESI], AL ;записуем баутовое значение ESI в AL 16
next_addr: 16
Inc esi ;esi увеличим на 1 16
loop next ;повторить next 16
16
push EBX ;изменяем EBX 16
mov EBX, offset S1 ;записуем в EBX S1 16
mov ECX, LS1 ;записуем в ECX длину S1 16
call write_con ;добавляем в сонсоль 16
pop EBX ;меняем значение EBX старое знач. утрачиваеться 16
16
call read_con ;редактируем консоль 16
ex: 16
push 0 16
call ExitProcess ;закрываем процес 16
;------ functions ---- 17
getout_hndl proc ;getout_hndl процесс 17
push STD_OUTP_HNDL ;изменяем STD_OUTP_HNDL 17
call GetStdHandle ;добавляем GetStdHandle 17
mov hStdOut, eax ;в hStdOut записуем eax 17
ret ;уменьшение указателя стека на 2 17
getout_hndl endp ;закрываем процесс 17
17
getinp_hndl proc 17
push STD_INP_HNDL 17
call GetStdHandle 17
mov hStdIn, eax 17
ret 17
getinp_hndl endp 17
17
write_con proc 17
push 0 ;lpReserved = NULL 17
push chrsWritten ;число байтов написаны на StdOut 17
17
push ECX 17
push EBX 17
push hStdOut 17
call WriteConsoleA 18
ret 18
write_con endp 18
18
read_con proc 18
push 0 ;lpReserved = NULL 18
push chrsRead 18
push lenReadBuf 18
push offset readBuf 18
push hStdIn 18
call ReadConsoleA 18
ret 18
read_con endp 18
;------------------- 18
18
end start 18
Выводы 19
Список использованных источников 20