Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для 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
<< Назад В начало Далее >> |
|