![Blog. Just Blog](/images/logo.png)
Быстрый поиск
Введите фрагмент названия статьи для поиска
![](/images/dot.gif)
Несколько полезных функций на Ассемблере
21.05.2011 | Категория: Образ мышления: Assembler | Автор: ManHunter
![](/upload/6e/93/6e932a0bda7151a677a83a99330de2e2.jpg)
Несколько полезных функций на Ассемблере
За время программирования на Ассемблере у меня накопилось несколько полезных решений. Выделять под каждое из них отдельную статью не хочется, а держать под рукой пригодится. Поэтому все сложу сюда, по мере надобности буду пополнять.
Читать статью целиком »
Просмотров: 28868 | Комментариев: 34
![](/images/dot.gif)
Сортировка массива строк на Ассемблере
29.01.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Долго откладывал написание этой функции, но теперь вот прижало. Получилась функция сортировки массива произвольных текстовых строк в формате ASCIIZ усовершенствованным методом "пузырька". Усовершенствование заключается в том, что если при очередном проходе ни одной сортировки не было выполнено, то дальнейшая обработка массива прекращается. В некоторых случаях это дает значительный выигрыш в скорости работы. Однако, алгоритм сортировки "пузырьком" в любом случае является самым медленным, поэтому для очень больших массивов эта функция не подойдет. Но мне для больших объемов ее и не надо, на массиве из нескольких сотен или даже тысяч строк скорость работы функции меня вполне устраивает.Code (Assembler) : Убрать нумерацию
- ;------------------------------------------------------------------
- ; Функция сортировки массива строк
- ; by ManHunter / PCL
- ; http://www.manhunter.ru
- ;
- ; Сортировка выполняется усовершенствованным методом "пузырька"
- ; Параметры:
- ; lpArray - указатель на массив адресов строк
- ; dFlag - метод сортировки: TRUE - по возрастанию,
- ; FALSE - по убыванию
- ; На выходе:
- ; отсортированный согласно правилу массив адресов строк
- ;------------------------------------------------------------------
- proc SortArray lpArray:dword, dFlag:dword
- pusha
- ; Указатель на массив адресов строк
- mov esi,[lpArray]
- mov ebx,[dFlag]
- sa_sort_1:
- ; Проверка на 0 - признак окончания массива
- mov eax,[esi]
- or eax,eax
- jz sa_stop_sort
- or bh,bh
- jnz sa_stop_sort
- ; Сравниваем, начиная со следующего элемента
- lea edi,[esi+4]
- ; Установить флаг, что сортировка не требуется,
- ; если дальнейший остаток массива уже отсортирован
- mov bh,1
- sa_sort_2:
- ; Следующий элемент 0 - массив закончился
- mov edx,[edi]
- or edx,edx
- jz sa_next_sort
- ; Сохранить текущие значения указателей
- push esi edi
- ; Указатели на строки
- mov esi,eax
- mov edi,edx
- sa_compare_string:
- ; Сравнить символы в строках
- mov cl,byte [edi]
- mov ch,byte [esi]
- ; Если символы равны, то сравнить следующие
- cmp cl,ch
- je sa_equal
- ; Проверка больше-меньше в зависимости от флага
- cmp bl,0
- jz @f
- cmp cl,ch
- ja ss_next_string
- jmp sa_change_offs
- @@:
- cmp cl,ch
- jb ss_next_string
- sa_change_offs:
- ; Поменять местами адреса строк
- xchg eax,edx
- ; Сбросить флаг, что сортировка не требуется
- xor bh,bh
- jmp ss_next_string
- sa_equal:
- ; Если закончилась строка, то перейти к следующей паре
- or cl,cl
- jz ss_next_string
- ; Перейти к следующей паре символов
- inc esi
- inc edi
- jmp sa_compare_string
- ss_next_string:
- ; Восстановить значения указателей и записать в них
- ; значения адресов строк, без разницы изменившихся или нет
- pop edi esi
- mov [esi],eax
- mov [edi],edx
- ; Перейти к следующему элементу массива
- add edi,4
- jmp sa_sort_2
- sa_next_sort:
- ; Перейти к следующему элементу массива
- add esi,4
- jmp sa_sort_1
- sa_stop_sort:
- popa
- ret
- endp
Читать статью целиком »
Просмотров: 18547 | Комментариев: 7
![](/images/dot.gif)
Функции base64 на Ассемблере
09.01.2009 | Категория: Образ мышления: Assembler | Автор: ManHunter
Алгоритм Base64 может использоваться в пользовательских почтовых приложениях, в качестве одного из уровней защиты шифрованием, для хранения двоичных данных и для решения многих других задачах. В большинстве языков высокого уровня используются штатные функции, в Ассемблере приходится все реализовывать самостоятельно.Алгоритм Base64 обратимый, то есть из закодированного текста можно в точности получить исходные данные. Начнем с функции кодирования.
Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------------------------
- ; Функция кодирования Base64
- ;---------------------------------------------------------------
- ; Параметры:
- ; lpFrom - указатель на исходные данные
- ; lpTo - указатель на буфер для приема кодированных данных
- ; dSize - размер исходных данных
- ; Функция ничего не возвращает
- ;---------------------------------------------------------------
- proc base64_encode lpFrom:dword, lpTo:dword, dSize:dword
- pusha
- mov ebx,.base64
- mov esi,[lpFrom]
- mov edi,[lpTo]
- mov ecx,[dSize]
- or ecx,ecx
- jz .r3
- .encode_loop:
- lodsd
- mov edx,eax
- bswap edx
- xor eax,eax
- shld eax,edx,6
- shl edx,6
- xlatb
- stosb
- xor eax,eax
- shld eax,edx,6
- shl edx,6
- xlatb
- stosb
- dec ecx
- jz .r2
- xor eax,eax
- shld eax,edx,6
- shl edx,6
- xlatb
- stosb
- dec ecx
- jz .r1
- xor eax,eax
- shld eax,edx,6
- shl edx,6
- xlatb
- stosb
- dec esi
- dec ecx
- jnz .encode_loop
- jmp .r3
- .r2:
- mov al,'='
- stosb
- .r1:
- mov al,'='
- stosb
- .r3:
- xor eax,eax
- stosb
- popa
- ret
- .base64 db 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
- db 'abcdefghijklmnopqrstuvwxyz'
- db '0123456789+/'
- endp
Читать статью целиком »
Просмотров: 5887 | Комментариев: 9
![](/images/dot.gif)
Преобразование строки в число
10.11.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Для конвертирования строки в число я использую две функции. Первая предназначена для конвертирования строки десятичных цифр в число:Code (Assembler) : Убрать нумерацию
- ;----------------------------------------------------------
- ; На входе: указатель на строку
- ; На выходе: EAX = число или 0 если не получилось
- ;----------------------------------------------------------
- proc str2dec lpStr:dword
- push ebx edx esi
- xor eax,eax
- mov esi,[lpStr]
- .str2dec_loop:
- movsx ebx,byte [esi]
- sub bl,'0'
- ; Для системы счисления с другим основанием замените следующую
- ; строчку на cmp bl,основание_системы
- cmp bl,10
- jnb .str2dec_ret
- ; Для системы счисления с другим основанием замените следующую
- ; строчку на imul eax,основание_системы
- imul eax,10
- add eax,ebx
- inc esi
- jmp .str2dec_loop
- .str2dec_ret:
- pop esi edx ebx
- ret
- endp
Читать статью целиком »
Просмотров: 16845 | Комментариев: 5
![](/images/dot.gif)
Вывод QWORD в виде десятичного числа
05.10.2008 | Категория: Образ мышления: Assembler | Автор: ManHunter
Для преобразования и форматированного вывода 32-битных значений в ассемблере используется стандартная API-функция wsprintf, но она бесполезна при работе с большими числами, например QWORD (64 бита). Значит обойдемся совсем без использования API.Code (Assembler) : Убрать нумерацию
- ;---------------------------------------------------
- ; Преобразование QWORD в десятичное число
- ; Параметры вызова:
- ; dwHigh - Старшее двойное слово
- ; dwLow - Младшее двойное слово
- ; lpBuff - указатель на буфер-приемник
- ;---------------------------------------------------
- proc bignum dwHigh:DWORD, dwLow:DWORD, lpBuff:DWORD
- pushad ; Сохранить все регистры
- mov eax,[dwLow] ; Младшее двойное слово
- mov edx,[dwHigh] ; Старшее двойное слово
- mov edi,[lpBuff] ; Указатель на буфер-приемник
- xchg esi,edx ; Сохранить старший dword
- mov ebx,10 ; Основание системы счисления
- xor ecx,ecx ; Счетчик десятичных цифр
- .bignum_1:
- xchg eax,esi ; Расчитать десятичную цифру
- xor edx,edx
- div ebx
- xchg esi,eax
- div ebx
- or dl,'0' ; Преобразовать результат в символ цифры
- push edx ; Сохранить цифру в стеке
- inc ecx ; Увеличить счетчик цифр
- or eax,eax ; Все преобразовали?
- jnz .bignum_1
- .bignum_2:
- pop eax ; Записать все цифры из стека в буфер
- stosb
- loop .bignum_2
- xor eax,eax ; Признак окончания строки
- stosb
- popad ; Восстановить все регистры
- ret ; Ворзврат из процедуры
- endp
Читать статью целиком »
Просмотров: 10144 | Комментариев: 4
![](/images/dot.gif)