
Быстрый поиск
Введите фрагмент названия статьи для поиска

Несколько полезных функций на Ассемблере
21.05.2011 | Категория: Образ мышления: Assembler | Автор: ManHunter
За время программирования на Ассемблере у меня накопилось несколько полезных решений. Выделять под каждое из них отдельную статью не хочется, а держать под рукой пригодится. Поэтому все сложу сюда, по мере надобности буду пополнять.Начну с функции очень быстрого копирования одного участка памяти в другой. Фишка в том, что основная часть строки копируется по 4 байта DWORD'ами, а остаток дописывается побайтно. Это дает нехилый выигрыш в скорости.
Code (Assembler) : Убрать нумерацию
- ;-----------------------------------------------------
- ; Функция быстрого копирования участка памяти
- ;-----------------------------------------------------
- ; lpDst - указатель на приемник
- ; lpSrc - указатель на источник
- ; dSize - размер копируемого блока
- ;-----------------------------------------------------
- proc _memcopy lpDst:DWORD, lpSrc:DWORD, dSize:DWORD
- pusha
- ; Установить указатели на источник и приемник
- cld
- mov edi,[lpDst]
- mov esi,[lpSrc]
- mov ecx,[dSize]
- push ecx
- ; Разделить на 4 и получить длину в DWORD
- shr ecx,2
- ; Скопировать основную часть строки DWORD'ами
- rep movsd
- pop ecx
- ; Получить остаток от деления на 4
- and ecx,3
- ; Скопировать остаток строки байтами
- rep movsb
- popa
- ret
- endp
Читать статью целиком »
Просмотров: 25480 | Комментариев: 31

Преобразование строки в число
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
Читать статью целиком »
Просмотров: 13959 | Комментариев: 5

Вывод 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
Читать статью целиком »
Просмотров: 8346 | Комментариев: 4
