Обучающие курсы:

Обучение профессии "Разработчик C#" + стажировка в Mail.ru
Обучение профессии "Разработчик Python" + трудоустройство
Обучение профессии "Веб-разработчик" + стажировка в Mail.ru


Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Строковые команды ассемблера очень полезны для оптимизации программ, написанных на языках высокого уровня. Команды копирования строк, конкатенации, поиска элементов, сравнения строк и заполнения области памяти определенными значениями есть в любом языке высокого уровня. Ассемблерный вариант реализации таких команд, как правило, требует намного меньше программного кода и выполняется быстрее.
Рассмотрим еще один пример операции со строками. Очень часто требуется преобразовывать символы нижнего регистра клавиатуры в символы верхнего. В этом фрагменте кода использование строковых команд может неоправданно усложнить программу, поэтому будем использовать обычные операторы. Полностью исходный текст приложения выглядит так, как показано в листинге 2.37.
Листинг 2.37. Программа, переводящая символы из нижнего регистра в верхний
.386
.model flat, stdcall
option casemap : none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\masm32.lib
.data
conTitle
mesl
len_mesl
mes2
len mes2
DB "Convert to upper", 0
DB "Before: ", 0
EQU $-mesl
DB "After: ", 0
EQU $-mes2
Si DB "a string must be converted to upper!", Odh, Oah, 0
LSI EQU $-Sl
CharBuf DB " ", 0
len_charBuf DD $-charBuf
readBuf DB ?
lenReadBuf DD 1
hStdln
hStdOut
DD 0
DD 0
chrsRead DD 0
chrsWritten DD 0
STD_INP_HNDL DD -10
STD OUTP HNDL DD -11
. code
start:
call
test
jz
push
call
test
jz
call
call
AiiocConsoie
EAX, EAX
ex
offset conTitle
SetConsoleTitleA
EAX, EAX
ex
getout_hndl
getinp hndl
push
mov
EBX
EBX, offset mesl
mov ЕСХ, len_mesl
call write_con
pop EBX
push EBX
mov EBX, offset SI
mov ECX, LSI
call write_con
pop EBX
push EBX
mov EBX, offset mes2
mov ECX, len_mes2
call write_con
pop EBX
; преобразование символов из нижнего регистра в верхний
lea ESI, DWORD PTR SI
mov ECX, DWORD PTR LSI
next:
mov AL, BYTE PTR [ESI]
cmp AL, 'a'
jb next_addr
cmp AL, 'z'
ja next_addr
and AL, Odfh
mov BYTE PTR [ESI], AL
next_addr:
inc ESI
loop next
push EBX
mov EBX, offset SI
mov ECX, LSI
call write_con
pop EBX
; ожидание ввода с консоли и выход
call read con
ex:
push 0
call ExitProcess
Процедуры
getout_hndl proc
push STD_OUTP_HNDL
call GetStdHandle
ret
getout_hndl endp
getinp_hndl proc
push STD_INP_HNDL
call GetStdHandle
mov hStdln, EAX
ret
getinp_hndl endp
write_con proc
push 0
push chrsWritten
push ECX
push EBX
push hStdOut
call WriteConsoleA
ret
write_con endp
read_con proc
push 0
push chrsRead
push lenReadBuf
push offset readBuf
push hStdln
call ReadConsoleA
mov hStdOut, EAX

ret
read_con endp
end start


 
 
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru